MYSQL嵌套游标产生混乱的解决方法及注意地方
来源:互联网 发布:mac 蓝牙 鼠标 编辑:程序博客网 时间:2024/05/29 12:37
1. 在编写存储过程中, 有时会处理些较复杂的数据, 用到多个游标, 并且嵌套使用,如果控制不好,
在子层游标记录处理完后, 上层游标也会捕获NOT FOUND异常, 并改变标示值. 产生数据混乱.
例:
BEGIN DECLARE name_stop int default 0; DECLAREcur_name CURSOR FOR SELECT NAMEFROM mytable; DECLARE CONTINUE HANDLER FOR NOT FOUND SET name_stop =1; open cur_name; FETCH cur_name into v_name;START TRANSACTION; BEGINDECLARE ext_stop int DEFAULT 0;DECLARE cur_ext CURSOR for select propertyidfrom propertys;DECLARE CONTINUE HANDLER FOR NOT FOUND SET ext_stop =1; ..............................
当子层cur_ext游标记录处理完后, 会抛出NOT FOUND, 不仅影响自身, 而且上层游标也会受影响, name_stop 会变成1, 这时就会跳出循环, 不再执行.
解决的办法是加入标记块放置复合语句中,
如: BLOCK1:BEGIN
....
END BLOCK1;
限制作用范围, 这样就能解决各游标间的干扰.
2. 在实际使用中, 可能会采用SELECT ... INTO ...语句进行赋值, 但是如果没有找到记录, 是不会把NULL值赋给相应变量, 而是抛出NOT FOUND.
如果采用了游标, 这将会影响正常使用.
所以, 最好把select into语句放入单独的复合语句, 并加入标记块,
注意, 需要加入一个临时的HANDLER, 如果没有HANDLER捕获, 仍会跳入上层, 影响游标.
正确使用方法, 如下所示:
BLOCK4: BEGIN DECLARE temp_a int default 0; declare continue handler for not found set temp_a = -1; select account into v_exist_account from t_user where account = v_account limit 1;end BLOCK4;
如果v_exist_account有后续业务处理, 记得处理完后要清空值.
- MYSQL嵌套游标产生混乱的解决方法及注意地方
- 游标的最大数异常产生原因及解决方法汇总
- mysql安装及注意地方
- MySQL产生死锁的根本原因及解决方法
- mysql 嵌套游标的使用
- Mysql----游标的嵌套循环
- fragment 嵌套 fragment 需要注意的地方
- oracle游标的使用要注意的地方
- mysql游标和嵌套游标
- mysql存储过程游标的嵌套
- MySQL+PHP产生乱码的原因及解决方法
- MySQL+PHP产生乱码的原因及解决方法
- Mysql 动态嵌套游标
- mysql游标嵌套循环
- mysql:游标嵌套使用
- mysql游标嵌套循环
- Mysql 游标嵌套
- GA的使用方法,及注意的地方
- 彻底搞定C语言指针
- android 动态设置ImageView图片
- const 进行一下详细的分析
- 第八周实验任务三--实现分数类中的运算符重载并可以完成分数的加减乘除、求反、比较的运算
- initWithNibName导致的初始化问题
- MYSQL嵌套游标产生混乱的解决方法及注意地方
- 光流计算方法及编程
- oracle之定时任务[转]
- 楔子
- android-status bar :状态栏通知
- Razor视图引擎之语法剖析1
- delphi 监控系统时间
- Toast
- A Simple POI3.8 Excel Download and Upload in Java Web