Mysql 未找到的声明继续处理程序不工作

Mysql 未找到的声明继续处理程序不工作,mysql,stored-procedures,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

嗨,我有以下存储过程

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值永远不会设置为真,因此它将进入无限循环。 我的代码有问题吗。 请找个人帮帮我

我找到了解决办法,谢谢你的帮助。 我认为我检查数值的方式是错误的。 现在,我想根据获取的行值从其他一些表中获取值。我怎样才能像这样打印结果 ||当前行值| |从其他表中获取的值|| 作为获取的所有行的结果。

尝试更改-

IF NOT b= TRUE THEN 
  FETCH cur_1 INTO a;
与-

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;

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


是的,我也这么做了。问题是b永远不会设为真,它将在其中循环bcoz。select语句返回了5行,但仍然只给出了第一行。这取决于你需要什么。您可以执行SELECT…INTO语句和WHERE条件,如“从表2中选择column1 INTO var1,其中id=a;”。或者尽量避免使用游标-使用JOIN子句编写一个SELECT查询以从两个表中获取数据。这是一条有用的注释,额外的
SELECT INTO
可能会打乱循环。
...
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