我只是尝试使用事件调度程序杀死mysql作业。 不幸的是,事件调度程序用错误消息填满我的日志文件: 无数据 - 提取零行
但我正在捕捉无数据异常。
为什么事件仍会抛出错误?
CREATE PROCEDURE `kill_run_aways`( IN runtime INT(7), IN username VARCHAR(32) )
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE connid INT UNSIGNED;
DECLARE cur1 CURSOR FOR SELECT ID FROM information_schema.PROCESSLIST
WHERE COMMAND ='Query'
AND TIME >= runtime AND USER = username;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO connid;
IF NOT done THEN
select * from information_schema.PROCESSLIST where connid=ID;
KILL connid;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
END;
谢谢阿曼。
答案 0 :(得分:2)
您应该在SQL_CALC_FOUND_ROWS
中为CURSOR
添加CURSOR
。接下来,在打开命令后检查您的DECLARE cur1 CURSOR FOR SELECT SQL_CALC_FOUND_ROWS '1' FROM DUAL;
OPEN cur1;
IF Select FOUND_ROWS() /* it concerns SQL_CALC_FOUND_ROWS */ > 0 THEN
-- do sth
ELSE
-- do sth else
END IF;
是否返回多行,例如
{{1}}
答案 1 :(得分:2)
您的代码是正确的,但MySQL的错误/奇怪行为会导致警告出现,即使它已被处理。如果在过程结束时添加一个“虚拟”语句并且成功,则可以避免这种情况。这将清除警告。 (见http://dev.mysql.com/doc/refman/5.5/en/show-warnings.html)
在你的情况下:
SELECT ID INTO connid FROM information_schema.PROCESSLIST LIMIT 1;
循环结束后。在MySQL 5.5.13上,Linux和Windows的警告消失了。我评论了MySQL Bug 60840,我希望他们将来会修复它......
答案 2 :(得分:0)
Mysql说NOT FOUND
“仅在游标的上下文中相关,用于控制当光标到达数据集末尾时发生的事情”(http://dev.mysql.com/doc/refman/5.5/en/declare-handler.html。所以我相信你得到了执行第select * from information_schema.PROCESSLIST where connid=ID;
行时的此消息。