Mysql-Events:如何摆脱错误,如无数据 - 零行获取?

时间:2011-05-09 16:00:44

标签: mysql events cursor

我只是尝试使用事件调度程序杀死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;

谢谢阿曼。

3 个答案:

答案 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;行时的此消息。