2017-08-31 67 views
0

我試圖創建函數,將殺死所有沉睡的連接:MySQL函數殺死熟睡的連接

CREATE DEFINER=`user`@`%` FUNCTION `kill_sleepers`() RETURNS int(11) 
BEGIN 
    DECLARE Id, result INT; 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE sleepers CURSOR FOR SELECT Id FROM INFORMATION_SCHEMA.processlist where COMMAND = 'Sleep'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    SET result = 0; 
    OPEN sleepers; 

    read_loop: LOOP 
     FETCH sleepers INTO Id; 
     IF done THEN 
      LEAVE read_loop; 
     END IF; 
     kill Id; 
      SET result = result + 1; 
    END LOOP; 

    CLOSE sleepers;  
    RETURN result; 
END 

但是當我運行它,我得到了「錯誤代碼:1094未知線程ID:0」。如果我把殺入:

IF Id != 0 THEN 
    kill Id; 
    SET result = result + 1; 
END IF; 

它會殺了什麼,我犯了什麼錯誤?

回答

0
DROP FUNCTION KILL_SLEEPERS; 
DELIMITER $$ 
CREATE FUNCTION KILL_SLEEPERS() 
    RETURNS INT READS SQL DATA 
    BEGIN 
     DECLARE DONE INT DEFAULT FALSE; 
     DECLARE VAR_ID INT; 
     DECLARE ITER INT; 
     DECLARE SLEEPERS CURSOR FOR SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'SLEEP'; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE; 
     SET ITER = 0; 
     OPEN SLEEPERS; 

     READ_LOOP: LOOP 
      FETCH SLEEPERS INTO VAR_ID; 
      IF DONE THEN 
       LEAVE READ_LOOP; 
      END IF; 
       KILL VAR_ID; 
      SET ITER = ITER + 1; 
     END LOOP; 
    CLOSE SLEEPERS; 
    RETURN ITER; 
END; 
$$ 
DELIMITER ; 

SELECT KILL_SLEEPERS(); 

試試上面的代碼。

我剛剛將變量名稱從ID更改爲VAR_ID