如何摆脱“错误1329:没有数据 - 零行取出,选择或处理”
我有一个存储过程,不需要返回任何值。它运行顺畅,没有任何问题。但是,它在完成运行后输出错误消息:如何摆脱“错误1329:没有数据 - 零行取出,选择或处理”
Error: No data - zero rows fetched, selected, or processed
我该如何摆脱此错误消息?
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
您需要定义诸如继续处理程序:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
所以它看起来像:
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;
我想你只是忘了在帖子下面一行:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
您的代码是相关的ct,但是mysql的bug /奇怪行为会导致即使处理它也会出现警告。如果您在过程的末尾添加一个“虚拟”语句来调用表并且成功,那么可以避免这种情况,这将清除警告。循环结束后
SELECT name INTO l_name FROM customer_tbl LIMIT 1;
:(见http://dev.mysql.com/doc/refman/5.5/en/show-warnings.html) 你的情况。 在MySQL 5.5.13上,警告在Linux和Windows上消失。 我评论MySQL的错误60840,我希望他们将来修复一段时间...
谢谢你。这为我解决了一个隐晦的问题 – Cruachan 2012-03-10 21:55:23
包括一个虚拟选择也为我解决了这个问题。虚拟选择必须位于外层功能中。用光标包含在函数中是不够的。 – user984003 2012-05-08 11:33:12
我有同样的问题,你的解决方案为我工作。谢谢 – 2013-05-31 00:16:18
我不知道这是否修复了游标问题,但我遇到了这个警告与存储的功能,发现如果你使用:
RETURN (SELECT x From myTable...);
代替
SELECT x into myVar...return myVar
我得到这个从这个有用的文档: http://bugs.mysql.com/bug.php?id=42834
非常感谢,它帮助我 – 2013-07-23 09:21:40
正常情况下,当您超出光标范围时,会发生这种情况,因此请检查FETCH
声明为
这应该是一个评论,而不是一个答案。检查这个[metaSO问题](http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question)和[Jon Skeet:Coding Blog]( http://msmvps.com/blogs/jon_skeet/archive/2009/02/17/answering-technical-questions-helpfully.aspx)如何给出正确的答案。 – Yaroslav 2012-10-11 18:19:51
的循环条件我尝试了这里和全部解决方案,包括继续处理程序为我工作。我仍然在MySQL错误日志中收到消息。我发现这也与我的“选择......进入......”这是有道理的,但我真的认为继续处理程序将为游标工作。无论哪种方式,我发现使用“found_rows()”找出是否有任何行被返回完美工作。这意味着简单的“select into”语句必须转换为光标,但它并不是很多工作,并且解决了问题。
DECLARE v_rowcount integer unsigned;
DECLARE cur_entries cursor for
select app_name, proc_name, error_code, sum(occurrences) occurrences
from that_table...;
open cur_entries;
set v_rowcount = found_rows();
if v_rowcount > 0 then
fetch cur_entries into v_app_name, v_proc_name, v_error_code, v_occurrences;
...
end if;
close cur_entries;
我写这在我的个人博客在这里:http://tinky2jed.wordpress.com/technical-stuff/mysql/mysql-no-data-zero-rows-fetched-how-to-code-for-it/
我遇到了这一点,并拉出我的头发,直到我在official mysql docs
Before MySQL 5.6.3, if a statement that generates a warning or error causes a condition handler to be invoked, the handler may not clear the diagnostic area. This might lead to the appearance that the handler was not invoked. The following discussion demonstrates the issue and provides a workaround.
过这个跑点击该链接,滚动到底部的细节,但修复是包括一个成功的选择内部继续处理程序:
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SELECT 1 INTO @handler_invoked FROM (SELECT 1) AS t;
END;
没有细节,我会第一个说 - 它可以被替换为'INSERT INTO names_tbl SELECT name FROM CUSTOMER_TBL' =) – 2010-08-11 22:21:41
感谢OMG小马。在实际的代码中“INSERT INTO names_tbl VALUES(l_name);”应该由200行代码替换。我使用了这个简化版本,因为即使是这个简化版本,我也会得到相同的错误。如果它帮助删除错误消息,我可以输出一个varchar作为返回值。 – Babibo 2010-08-11 22:26:29