您好我有以下存储过程
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,因此会进入无限循环。 我的代码有什么问题。 请有人帮帮我..
我得到了解决方案,谢谢你的帮助。 我认为我检查价值观的方式是错误的。 所以现在,我想根据获取的行值从其他表中获取值。我怎样才能打印出结果 ||当前行值||从其他表||获取的值 作为获取的所有行的结果。
答案 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