关于游标,这两点你忽略了吗

php中文网
发布: 2016-06-07 16:09:15
原创
1499人浏览过

今天写个稍微复杂一点点的存储过程碰到两个容易忽略的点分享一下。如果有筒子刚好碰到相同的问题可以少再纠结一下, 木有啥技术含量的。。。 1、一个存储过程使用游标的例子 假设很简单的一个要求:从t表里面遍历出f,然后再到t2表中查找符合条件的记录打出

今天写个稍微复杂一点点的存储过程碰到两个容易忽略的点分享一下。如果有筒子刚好碰到相同的问题可以少再纠结一下, 木有啥技术含量的。。。

1、一个存储过程使用游标的例子

假设很简单的一个要求:从t表里面遍历出f,然后再到t2表中查找符合条件的记录打出来。

<ol class="dp-sql"><li class="alt"><span><span class="keyword">declare</span><span> stopFlag </span><span class="keyword">int</span><span>; </span></span></li><li><span><span class="keyword">DECLARE</span><span>  cur_name </span><span class="keyword">CURSOR</span><span> </span><span class="keyword">for</span><span> f </span><span class="keyword">from</span><span> t; </span></span></li><li class="alt"><span><span class="keyword">DECLARE</span><span> </span><span class="keyword">CONTINUE</span><span> HANDLER </span><span class="keyword">FOR</span><span> </span><span class="op">NOT</span><span> FOUND </span><span class="keyword">set</span><span> stopFlag=1; </span></span></li><li><span><span class="keyword">set</span><span> stopFlag=0; </span></span></li><li class="alt"><span><span class="keyword">open</span><span> cur_name; </span></span></li><li><span>REPEAT </span></li><li class="alt"><span><span class="keyword">FETCH</span><span> cur_name </span><span class="keyword">INTO</span><span> temp_f; </span></span></li><li><span><span class="keyword">begin</span><span> </span></span></li><li class="alt"><span>   <span class="keyword">select</span><span> f3 </span><span class="keyword">into</span><span> my_result </span><span class="keyword">from</span><span> t2 </span><span class="keyword">where</span><span> f2=temp_f  limit 1; </span></span></li><li><span><span class="keyword">end</span><span>; </span></span></li><li class="alt"><span>UNTIL stopFlag = 1 </span></li><li><span><span class="keyword">END</span><span> REPEAT; </span></span></li><li class="alt"><span><span class="keyword">CLOSE</span><span> cur_name; </span></span></li></ol>
登录后复制

2、 点1

假设t表有n条记录,这个循环体循环n次?

实际上是n+1次。因为到达t的最后一行的时候stopFlag还是1。这个值的修改是在下一次fetch的时候改的,但是改完后就进入begin了,没有再判断,所以会多执行一次。这多出来的一次的temp_f的值和上一次相同。

解决方法:在进入Begin之后再判断一下stopFlag的值

Writecream
Writecream

AI作家和文案内容生成器

Writecream 63
查看详情 Writecream

3、 点2

有时候会发现没有循环到n次循环就退出,什么原因?

原因是如果select f3 into my_result from t2 where f2=temp_f limit 1; 条件无法匹配行,在试图对my_result赋值的时候就会触发set stopFlag=1; 导致在之后的until判断的时候满足退出条件而退出。

解决方法:特别小心循环体内部出现的这种语句。如果有的话,在进入begin之后把stopFlag存入一个临时变量,在until之前把这个临时变量赋回去就行了

原文链接:http://dinglin.iteye.com/blog/1181109


最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号