MySQL(存储过程)游标循环在没有CONTINUE HANDLER的情况下工作

时间:2014-03-06 20:23:21

标签: mysql sql stored-procedures cursor infinite-loop

当我运行以下MySQL服务器存储过程时,我希望它能永远运行,因为没有CONTINUE HANDLER

BEGIN
   DECLARE p INT(11) DEFAULT 0;
   DECLARE no_more_rows BOOLEAN DEFAULT false;

   DECLARE testA INT;

   DECLARE iCursor CURSOR FOR SELECT test_a FROM Temp;

   OPEN iCursor;
       id_loop: LOOP
           FETCH iCursor INTO testA;
           SET p = p + 1;
           INSERT INTO Temp2 (test1, test2) VALUES (testA, p);
       END LOOP; 
   INSERT INTO Temp3 SET Finished=1;        
   CLOSE iCursor;
END

但似乎CURSOR工作正常,并将Temp表中的所有值写入Temp2表(并且还没有更多的值写入表中的计数器p)。当我检查MySQL服务器上正在运行的进程时,该过程也不再运行。

但是完成的代码没有写入Temp3表,因此我认为光标也没有正确关闭。

有人知道这里发生了什么吗?

为什么循环无法运行?

是否可以实现这样的游标(如果没有代码应该在循环之后运行)?

1 个答案:

答案 0 :(得分:1)

您是如何调用存储过程的?

我明白了:

mysql> CALL sp_test;
ERROR 1329 (02000): No data - zero rows fetched, selected, or processed

错误会终止存储过程的执行,因此请勿在{{1​​}}上写入,也不要关闭游标。

SQL Fiddle demo