MySQL存储过程循环中使用游标方法及遇到的问题总结

作者有9年Oracle开发经验,转到MySQL后对其存储过程语法不太习惯。公司需用存储过程处理数据,作者分享了MySQL存储过程中循环的使用,包括游标定义等,还指出循环无法正常退出的问题,如赋值语句未查到数据、多层循环内循环修改变量等,需重置变量值解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle开发9年,频繁使用存储过程。现转到mysql,使用存储过程还是不太习惯,语法差别比较大,而且没有深入去了解过mysql的存储过程语法。
现在公司有部分数据需要通过存储过程处理,只能硬着头皮上了。
1.循环
与oracle 用法基本一样,使用loop或者while
首先定义一个游标

DECLARE rs CURSOR FOR 
  SELECT
		contract_id
	FROM
		data_sale_contract_delay
	WHERE FLAG IS NULL or FLAG= '';

在游标定义后面要定义一个如果游标移动到最后一行数据后再次移动后处理的语句.

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

这个语句的含义是在fetch 不到内容时,将变量done 赋值为1.用来做跳出循环判断用.
此处与Oracle不同,Oracle会更简单,直接exit when v_cur%notfound;就可以跳出循环.v_cur是游标的名字.

接下来打开游标,遍历:

OPEN rs;
FETCH NEXT FROM rs INTO v_contract_id;
WHILE (done<>1) DO
 ...    -- 处理逻辑省略
  FETCH NEXT FROM rs INTO v_contract_id;-- 处理完成后直接再从游标读取下一条数据,如果已是最后一条数据,再fetch时会出发上面的 CONTINUE HANDLER,将变量done 值改成1
END WHILE;
CLOSE rs;

2.循环无法正常退出问题

  • 由于while中使用了select XX into XX from XXX的这种赋值语句在 select 的时候,没查到数据,导致出发handler将done修改为1,然后光标就会跳出循环。
  • 或者多层循环嵌套时内循环出现将done修改为1的情况。
    以上这两种情况,都是因为CONTINUE HANDLER把done更新造成的,如果遇到此类问题,需要在每次可能出现done被改变的地方处理完逻辑后增加set done=0;把变量值改一下,这样就可以继续执行了。

参考文章:
mysql游标实现时当内部查询有一次未查询到结果时就自动退出循环解决办法
MySQL 游标循环未完成就中止了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀不封

打赏就是对作者的一种赞赏和鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值