mysql DECLARE CONTINUE HANDLER FOR NOT FOUND

来源:互联网 发布:c templates 源码 编辑:程序博客网 时间:2024/05/28 22:10

提到mysql的错误异常处理,肯定大家都会百度一下,会了解到mysql的Condition和Handler,说白了,就是出现某种情况下,让程序怎么做,是Continue还是exit。

但今天说的是DECLARE CONTINUE HANDLER FOR NOT FOUND,其中的一个。

因为在改造之前的存储过程时,没有深究其用法作用,导致在后面修改存储过程时出现问题。

用到DECLARE CONTINUE HANDLER FOR NOT FOUND,当时是在用游标时配合使用的,用于什么时候终止游标(大体了解至此,就没有深究)

在后面一次修改中,发现在循环体中,加入了一段查询语句赋值后,执行存储过程,结果就永远只有一条(刚开始不知原因,通过其他方式解决了)

再次查看存储过程,分析原因,才发现原来是和DECLARE CONTINUE HANDLER FOR NOT FOUND有关系

就是因为之后加的查询语句中可能不存在(虽然当时想过这方面的原因,但没想到是这样),

采用select...into...语句进行赋值,找不到记录,会抛出NOT FOUND,这样就影响到为游标使用的DECLARE CONTINUE HANDLER FOR NOT FOUND

这样只要执行了没有查询结果的sql语句,则就会抛出NOT FOUND,这样游标将不会继续循环,这就是为什么当时执行的结果只有一条。


解决方法:1.上面说的其他方式解决,正好上面要先查询下count(),这样通过是否存在记录做判断,如果有则查询,没有就不查询;

2.但如果用到的查询比较多,那上面的那种方法就不太适合了,了解了一下,可以使用BLOCK1:BEGIN。。。END BLOCK1;这样就不影响上面游标的循环了,一般用于有游标嵌套可以考虑。

例如

BLOCK1:BEGIN
DECLARE done int default 0;
DECLARE continue handler for not found set done= -1;

select 为空的查询语句

END BLOCK1;


0 0
原创粉丝点击