mysql游标多读取一条记录_利用游标查询记录, 怎么多一条记录呢??

在使用MySQL游标查询记录时,发现多读取了一条重复记录。问题出在当游标到达最后一行时,由于没有判断是否已到末尾,导致最后一次fetch的值在done被设置为1后仍然被输出。解决方案是在repeat循环内部增加一个判断,只有在done未被设为1时才执行select o,避免了重复输出。
摘要由CSDN通过智能技术生成

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

利用游标查询记录, 怎么多一条记录呢??=================

BEGIN

#Routine body goes here...

DECLARE done BOOLEAN DEFAULT 0;

DECLARE o INT;

# 定义游标

DECLARE ordernumbers CURSOR

FOR

SELECT order_num FROM orders ORDER BY order_num;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

#CREATE TABLE IF NOT EXISTS test_table(order_num int);

OPEN ordernumbers;

REPEAT

FETCH ordernumbers INTO o;

select o;

#INSERT INTO test_table(order_num) VALUES (o);

UNTIL done END REPEAT;

CLOSE ordernumbers;

END

出现了,多一个条记录的问题;mysql> call processorders();

+-------+

| o |

+-------+

| 20005 |

+-------+

1 row in set (0.00 sec)

+-------+

| o |

+-------+

| 20006 |

+-------+

1 row in set (0.00 sec)

+-------+

| o |

+-------+

| 20007 |

+-------+

1 row in set (0.00 sec)

+-------+

| o |

+-------+

| 20008 |

+-------+

1 row in set (0.00 sec)

+-------+

| o |

+-------+

| 20009 |

+-------+

1 row in set (0.00 sec)

+-------+

| o |

+-------+

| 20009 |

+-------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

==================

分析:(其他类似的问题,copy过来的)

repeat

/*游标向下走一步*/

FETCH cur1 INTO o;

select o;

until done end repeat;

你可以设想一下最后一条记录时。 把值赋给 o, 你的程序 select o 输出,此刻 done 为0 ,

然后执行 repeat, 再执行 FETCH cur1 INTO o; 此时,已经没有记录,导致 done 为 1, o中的值仍是上次的值没有更新。 再执行 select o; 输出仍为上次的 o值。 until done end repeat; done 已被置为1,退出循环。

=========解决方法:=========加一个判断就好了。

repeat

FETCH cur1 INTO o;

if not done then

select o;

end if;

until done end repeat;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值