2011-05-09 55 views
0

我只是嘗試使用事件調度程序殺死mysql作業。 不幸事件調度充滿了錯誤信息我的日誌文件: 無數據 - 零行獲取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

Mysql的說,NOT FOUND「僅在遊標的背景是相關的,用來控制當光標到達數據集的結尾會發生什麼」(http://dev.mysql.com/doc/refman/5.5/en/declare-handler.html。所以,我相信你得到這個消息被執行的行select * from information_schema.PROCESSLIST where connid=ID;時。

+0

感謝您的回答。我剛剛評論了select *語句。情況並沒有改變。過程調用總是拋出警告:1329,事件後來成爲錯誤。 – Arman 2011-05-09 16:29:03

+0

您也可以嘗試爲'SQLWARNING'添加一個空處理程序:'爲SQLWARNING開始END_; DECLARE CONTINUE HANDLER''在您的程序中抑制警告 – a1ex07 2011-05-09 18:34:24

+0

這可能是mysql 5.5 linux brunch中的BUG,事件在錯誤日誌文件中始終寫入錯誤。我沒有看到5.1和Windows上的這種行爲。 – Arman 2011-05-10 16:01:20

2

你應該CURSOR。接下來,打開命令檢查後,添加SQL_CALC_FOUND_ROWS您查詢是否你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; 
2

你的代碼是正確的,但一個bug /奇怪的行爲MySQL cau即使處理,也會顯示警告。如果您在涉及表的成功過程的末尾添加「虛擬」語句,則可以避免這種情況。這將清除警告。循環結束後

SELECT ID INTO connid FROM information_schema.PROCESSLIST LIMIT 1; 

:(見http://dev.mysql.com/doc/refman/5.5/en/show-warnings.html

你的情況。在MySQL 5.5.13上,Linux和Windows的警告消失了。我對MySQL Bug 60840發表了評論,希望他們能在未來一段時間修復它...