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