请问存储过程关闭游标后面的sql语句是滞还会继续执行? 见代码:DECLARE f1 as varchar(10);
DECLARE cur1 CURSOR FOR select f1 from t1;
OPEN cur1;
    FETCH cur1 INTO f1;
    WHILE (f1 is not null ) DO      select f1;      FETCH cur1 INTO s_DlrCode;
    END WHILE;   
    CLOSE cur1;update table2 set v1=1 where a=1;
我的问题是,当 close cur1 时,后面的 update 语句不会被执行了,请问这有什么问题吗?

解决方案 »

  1.   

    会执行。
    你的代码应该是出错了。FETCH cur1 INTO s_DlrCode; 当最后一条记录后,应该是错误。
      

  2.   

    建议提供你的 create table / insert into / create procedure 等语句,这样别人可以直接在自己的机器上进行调试。否则只能靠眼睛来检查。
      

  3.   

    非常感谢你的帮助。我把完成的代码贴出来,请再帮着看下,谢谢。CREATE DEFINER = 'root'@'localhost' PROCEDURE `new_proc`()
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN
        declare s_DlrCode varchar(10);
    DECLARE cur1 CURSOR FOR select Distinct DlrCode from dms_tmp_tbl_dmsusage_dlr;  
        OPEN cur1;
        FETCH cur1 INTO s_DlrCode;
        WHILE (s_DlrCode is not null ) DO
             
         select  s_DlrCode ; 
            
        FETCH cur1 INTO s_DlrCode;
        END WHILE;   
        CLOSE cur1; select 'ggggggggggggggggggggggaoming';END;这里的 select 'ggggggggggggggggggggggaoming'; 没有被执行。
      

  4.   

    下面很清楚了,正如 #1楼 所说 你的程序出错中断了! mysql> call new_proc();
    +-----------+
    | s_DlrCode |
    +-----------+
    | a1        |
    +-----------+
    1 row in set (0.00 sec)+-----------+
    | s_DlrCode |
    +-----------+
    | a2        |
    +-----------+
    1 row in set (0.00 sec)ERROR 1329 (02000): No data - zero rows fetched, selected, or processed
    mysql>
      

  5.   

    一般游标处理用 HANDLER  来控制捕捉结束MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html手册中的例子如下
    CREATE PROCEDURE curdemo()
    BEGIN
      DECLARE done INT DEFAULT 0;
      DECLARE a CHAR(16);
      DECLARE b,c INT;
      DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
      DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  OPEN cur1;
      OPEN cur2;  REPEAT
        FETCH cur1 INTO a, b;
        FETCH cur2 INTO c;
        IF NOT done THEN
           IF b < c THEN
              INSERT INTO test.t3 VALUES (a,b);
           ELSE
              INSERT INTO test.t3 VALUES (a,c);
           END IF;
        END IF;
      UNTIL done END REPEAT;  CLOSE cur1;
      CLOSE cur2;
    END