DECLARE CONTINUE HANDLER FOR NOT FOUND无效

时间:2011-10-10 11:28:51

标签: mysql stored-procedures

您好我有以下存储过程

DROP PROCEDURE IF EXISTS `p25`$$

CREATE DEFINER=`root`@`%` PROCEDURE `p25`()
BEGIN
DECLARE b BOOLEAN;
DECLARE a VARCHAR(10);

DECLARE cur_1 CURSOR FOR SELECT t FROM sample_table;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET b = TRUE;

OPEN cur_1;
lbl:LOOP

IF b = TRUE THEN 
    LEAVE lbl;
END IF;
IF NOT b= TRUE THEN 
        FETCH cur_1 INTO a; 
END IF;

END LOOP;
CLOSE cur_1;
END$$

select语句实际返回5行 但是在获取一行之后的上述过程中,它不会循环通过其他行。 并且b值永远不会设置为true,因此会进入无限循环。 我的代码有什么问题。 请有人帮帮我..

我得到了解决方案,谢谢你的帮助。 我认为我检查价值观的方式是错误的。 所以现在,我想根据获取的行值从其他表中获取值。我怎样才能打印出结果 ||当前行值||从其他表||获取的值 作为获取的所有行的结果。

2 个答案:

答案 0 :(得分:1)

尝试改变 -

IF NOT b= TRUE THEN 
  FETCH cur_1 INTO a;

with -

IF b IS NULL THEN 
  FETCH cur_1 INTO a; 

试试这段代码 -

DECLARE b INT DEFAULT 0;
DECLARE a VARCHAR(10);

DECLARE cur_1 CURSOR FOR SELECT t FROM sample_table;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;

OPEN cur_1;

REPEAT
  FETCH cur_1 INTO a;
  IF NOT b THEN
    -- do something:
    ...
    ...
    ...
  END IF;
UNTIL b END REPEAT;

CLOSE cur_1;

答案 1 :(得分:0)

原因之一可能是您可能再次在游标内部使用了select into语句,这将游标循环内那些嵌套的select语句的处理程序值设置为1。您可以在内部使用了select语句后将处理程序值重置为0,然后将处理程序条件移到FETCH命令旁边。 示例:

...
BEGIN
DECLARE cursor_finished INTEGER DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_finished = 1;
...
open table_cursor;
get_row: LOOP
  FETCH table_cursor INTO v_variable1, v_variable3;
  IF cursor_finished = 1 THEN 
    LEAVE get_row;
  END IF;
  ....
  Select id into v_id from sometable; -- this sets cursor_finished to 1.
  SET cursor_finished = 0; -- hence reset this value for cursor.
  ....
END