CREATE PROCEDURE add_test()    
BEGIN
DECLARE a int;
DECLARE success int; 
DECLARE failure int;
DECLARE stop int default 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1;
DECLARE cursor_name CURSOR FOR select ID FROM `sms_send_log` where is_long_sms<>1;  
OPEN cursor_name; 
FETCH cursor_name INTO a;
WHILE stop<>1 DO   
set success = select count(B.ID) FROM sms_send_real_log AS B,sms_send_log AS C WHERE B.ID = C.ID AND B.status = 1 AND C.ID=a;
set failure = select count(B.ID) FROM sms_send_real_log AS B,sms_send_log AS C WHERE B.ID = C.ID AND B.status = 0 AND C.ID=a;
update sms_send_log set SMS_SUCCESS_NUM= success,SMS_FAILURE_NUM=failure where ID= a;
END WHILE;
CLOSE cursor_name;
END
call add_test();本人参考网上的教程写了一个存储过程,不知道为什么老是语法错误,目的就是把select ID FROM `sms_send_log` where is_long_sms<>1取到的id作为变量条件,对下面的语句进行更新操作,请 
各位大神帮忙看看,或者写个别的,多谢大家!

解决方案 »

  1.   

    定义变量和表属性,最好不要使用数据库关键字 ,例如"stop" ,"start","name"等,我根据你的存储过程代码,整理好的存储过程脚本如下,希望对你有帮助:
    CREATE 
    PROCEDURE binxian.add_test()
    BEGIN
    DECLARE ps_id int;
    DECLARE success int; 
    DECLARE failure int;
    DECLARE done1 int default 0;
    DECLARE cur1 cursor for  SELECT  ID FROM `sms_send_log` where is_long_sms<>1;  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = 1;
    open cur1;
    repeat
    FETCH cur1 INTO ps_id;
    if not done1 then
    select count(B.ID) into  success  FROM sms_send_real_log AS B,sms_send_log AS C WHERE B.ID = C.ID AND B.status = 1 AND C.ID=ps_id;
    select count(B.ID) into  failure FROM sms_send_real_log AS B,sms_send_log AS C WHERE B.ID = C.ID AND B.status = 0 AND C.ID=ps_id;
    update sms_send_log set SMS_SUCCESS_NUM= success,SMS_FAILURE_NUM=failure where ID= ps_id;
    end IF;
    until done1 end
    REPEAT;
      CLOSE cur1;
    commit;
    END
      

  2.   

    DELIMITER $$
    DROP PROCEDURE IF EXISTS add_test$$
    CREATE PROCEDURE add_test()    
     BEGIN
     DECLARE a INT;
     DECLARE success INT; 
     DECLARE failure INT;
     DECLARE STOP INT DEFAULT 0;
     DECLARE cursor_name CURSOR FOR SELECT ID FROM `sms_send_log` WHERE is_long_sms<>1;  
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET `stop`=1;
      OPEN cursor_name; 
     FETCH cursor_name INTO a; 
     WHILE STOP<>1 DO   
     SET success = (SELECT COUNT(B.ID) FROM sms_send_real_log AS B,sms_send_log AS C WHERE B.ID = C.ID AND B.status = 1 AND C.ID=a);
     SET `stop`=0;
     SET failure = (SELECT COUNT(B.ID) FROM sms_send_real_log AS B,sms_send_log AS C WHERE B.ID = C.ID AND B.status = 0 AND C.ID=a);
     SET `stop`=0;
     UPDATE sms_send_log SET SMS_SUCCESS_NUM= success,SMS_FAILURE_NUM=failure WHERE ID= a;
     SET `stop`=0;
     END WHILE;
     CLOSE cursor_name;
     END$$
     DELIMITER $$