【问题标题】:MySQL (stored procedure) cursor loop works without CONTINUE HANDLERMySQL(存储过程)游标循环在没有 CONTINUE HANDLER 的情况下工作
【发布时间】:2014-03-06 20:23:20
【问题描述】:

当我运行以下 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 服务器上正在运行的进程时,该过程也不再运行。

但 Finished 代码没有写入 Temp3 表,因此我认为游标也没有正确关闭。

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

为什么循环不是无限循环的?

可以实现这样的游标吗(以防循环后没有应该运行的代码)?

【问题讨论】:

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


    【解决方案1】:

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

    我明白了:

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

    错误终止了存储过程的执行,所以不要写temp3也不要关闭游标。

    SQL Fiddle demo

    【讨论】:

    • 之前是从php执行的,错误被忽略了。感谢您为我澄清事情的答案。
    猜你喜欢
    • 2013-08-02
    • 2010-09-18
    • 2019-04-29
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2012-08-12
    相关资源
    最近更新 更多