如何摆脱"错误1329:没有数据 - 提取,选择或处理零行"

Bab*_*ibo 30 mysql sql stored-procedures

我有一个存储过程,不需要返回任何值.它运行顺畅,没有任何问题.但是,它在完成运行后输出错误消息:

错误:无数据 - 提取,选择或处理零行

如何摆脱此错误消息?

CREATE PROCEDURE `testing_proc`()  
    READS SQL DATA  
BEGIN  
    DECLARE done INT DEFAULT 0;
    DECLARE l_name VARCHAR(20);
    DECLARE my_cur CURSOR FOR
        SELECT name FROM customer_tbl;
    OPEN my_cur;
        my_cur_loop:
        LOOP FETCH my_cur INTO l_name;
            IF done = 1 THEN
                LEAVE my_cur_loop;
            END IF;
            INSERT INTO names_tbl VALUES(l_name);
        END LOOP my_cur_loop;
    CLOSE my_cur;
END
Run Code Online (Sandbox Code Playgroud)

小智 39

我想你只是忘了在帖子中包含以下内容:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
Run Code Online (Sandbox Code Playgroud)

您的代码是正确的,但mysql的错误/奇怪行为会导致警告出现,即使它已被处理.如果在程序结束时添加"虚拟"语句来调用表并且成功,则可以避免这种情况,这将清除警告.(见http://dev.mysql.com/doc/refman/5.5/en/show-warnings.html)在你的情况下:

SELECT name INTO l_name FROM customer_tbl LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

循环结束后.在MySQL 5.5.13上,警告在Linux和Windows上消失.我评论了MySQL Bug 60840,我希望他们将来会修复它...


小智 28

您需要定义一个继续处理程序,如:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
Run Code Online (Sandbox Code Playgroud)

所以它看起来像:

DECLARE done INT DEFAULT 0;
DECLARE l_name VARCHAR(20);
DECLARE my_cur CURSOR FOR
    SELECT name FROM customer_tbl;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN my_cur;
    my_cur_loop:
    LOOP FETCH my_cur INTO l_name;
        IF done = 1 THEN
            LEAVE my_cur_loop;
        END IF;
        INSERT INTO names_tbl VALUES(l_name);
    END LOOP my_cur_loop;
CLOSE my_cur;
Run Code Online (Sandbox Code Playgroud)


Dan*_*Ger 8

我遇到了这个并拔出我的头发,直到我在官方的mysql文档中遇到这个

在MySQL 5.6.3之前,如果生成警告或错误的语句导致调用条件处理程序,则处理程序可能无法清除诊断区域.这可能会导致未调用处理程序的外观.以下讨论演示了该问题并提供了一种解决方法.

单击链接并滚动到底部以获取详细信息,但修复包括成功选择INSIDE CONTINUE HANDLER:

  DECLARE CONTINUE HANDLER FOR NOT FOUND
    BEGIN
       SELECT 1 INTO @handler_invoked FROM (SELECT 1) AS t;
    END;
Run Code Online (Sandbox Code Playgroud)