首页 >数据库 >mysql教程 >关于游标,这两点你忽略了吗

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB原创
2016-06-07 16:09:151267浏览

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

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


声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn