1

我有一个杀死睡眠进程的程序,但循环继续运行,我没有得到结果。循环继续运行。

DELIMITER $$
CREATE PROCEDURE `uKillSleepingSessions`(v_time INT )
BEGIN

DECLARE no_more_rows INT DEFAULT 0;
DECLARE loop_cntr INT DEFAULT 0;
DECLARE num_rows INT DEFAULT 0;
DECLARE V_ID bigint(4);
DECLARE v_time INT;

DECLARE my_cur CURSOR FOR
SELECT ID
FROM information_schema.PROCESSLIST PL
WHERE PL.COMMAND='Sleep' AND DB='test'
AND PL.TIME = v_time ;

DECLARE CONTINUE HANDLER FOR 1329
SET no_more_rows = 1;
OPEN my_cur;
SET num_rows = FOUND_ROWS();

IF
num_rows > 0 THEN

FETCH my_cur
INTO V_ID;
END IF;
the_loop: LOOP
IF no_more_rows = 1 THEN  
CLOSE my_cur;
LEAVE the_loop;
END IF;
IF
num_rows > 0 THEN
SET @sql= CONCAT("KILL ",V_ID);
PREPARE s1 FROM @sql;
EXECUTE s1;
DEALLOCATE PREPARE s1;
END IF;
SET loop_cntr = loop_cntr + 1;
END LOOP the_loop;
END

请建议我哪里错了。我该如何修改它。可以修改 proc 以处理未知线程。谢谢

4

1 回答 1

0

基本上 cursor 获取 select 语句中的所有 ID,但有时在处理 ID 时它可能不存在,因此当 prepare 语句中的 sql 语句执行时,丢失的 ID 将不存在,因此它会抛出未知线程。没有手册可以处理这个问题。如果有人知道,请提出建议。

于 2013-07-08T18:02:48.097 回答