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)
我遇到了这个并拔出我的头发,直到我在官方的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)
归档时间: |
|
查看次数: |
56435 次 |
最近记录: |