博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 存储过程使用游标时 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE 会提前执行的坑...
阅读量:6927 次
发布时间:2019-06-27

本文共 1091 字,大约阅读时间需要 3 分钟。

hot3.png

我们在使用储存过程中使用游标遍历数据的时候的基本写法如下:

create procedure proc_test() sql security invokerbegin  declare p_id varchar(32);  declare done tinyint default false;  declare c_cur cursor for select id from user;  declare continue handler for not found set done = true;    open c_cur;    fetch c_cur into p_id;    while !done do    ... #程序逻辑    fetch c_cur into p_id;    end while;  close c_cur;end;

正常情况这么写是没问题的,可是如果你在while里面的要是有select语句的话就有问题了。如果说你的处理逻辑是这样的:

while !done do  select * from user_role r where r.user_id = p_id;  fetch c_cur into p_id; end while;

那么当你的select * from user_role r where r.user_id = p_id;找不到数据的时候,declare continue handler for not found set done = true;这句就会执行,有done = true,所以循环体会提前跳出。通过测试得出,declare continue handler for not found set done = true 是对全局的select有效的,只要有一条select语句返回空,那么就是触发该语句。

解决方法就是确保while里面的select永远不会返回空

select * from user_role r where r.user_id = p_id;#改成下面这样select col1, col2, ... from(select col1, col2, ... from user_role r where r.user_id = p_idunion allselect '' col1, '' col2, ...) t

这样的话就可以保证select肯定不是空集合。

转载于:https://my.oschina.net/linchuhao23/blog/2252251

你可能感兴趣的文章
Java类的初始化顺序
查看>>
揭秘天猫双11背后:2500万超高清直播的“硬实力”
查看>>
微软这次开源的是 Windows 计算器
查看>>
App Store被拒绝后的解决方案中心
查看>>
RHEL 8 删除 MongoDB
查看>>
linux中数据库的安装 增删改查
查看>>
SpringBoot 整合 oauth2(五)实现 jwt 及 扩展
查看>>
Kafka与Redis比较
查看>>
SpringBoot启动抛出Unregistering JMX-exposed beans on shutdown异常
查看>>
努力吧!钢铁侠!
查看>>
JavaScript机器学习之线性回归
查看>>
详解:淘宝大秒杀系统是如何设计的?
查看>>
良好的代码格式反映了程序员的编码能力,好的程序员应该这么编码
查看>>
标准模板库(STL)学习指南之map映射
查看>>
【Python】动手分析天猫内衣售卖数据,得到你想知道的信息!
查看>>
设计模式四: 抽象工厂(Abstract Factory)
查看>>
概率问题,从癌症检测到贝叶斯网络
查看>>
简单说说Kafka中的时间轮算法
查看>>
【多线程】-ThreadPool线程池
查看>>
React Native 简介:用 JavaScript 搭建 iOS 应用 (1)
查看>>