> 데이터 베이스 > MySQL 튜토리얼 > MySQL非源码学习:关于存储过程的中游标两个容易忽略的点_MySQL

MySQL非源码学习:关于存储过程的中游标两个容易忽略的点_MySQL

WBOY
풀어 주다: 2016-06-01 13:45:05
원래의
932명이 탐색했습니다.

bitsCN.com

今天写个稍微复杂一点点的存储过程碰到两个容易忽略的点分享一下。如果有筒子刚好碰到相同的问题可以少再纠结一下, 木有啥技术含量的。。。
 
1、一个存储过程使用游标的例子
假设很简单的一个要求:从t表里面遍历出f,然后再到t2表中查找符合条件的记录打出来。
 
declare stopFlag int;
DECLARE  cur_name CURSOR for f from t;
DECLARE CONTINUE HANDLER FOR NOT FOUND set stopFlag=1;
set stopFlag=0;
open cur_name;
REPEAT
FETCH cur_name INTO temp_f;
begin
   select f3 into my_result from t2 where f2=temp_f  limit 1;
end;
UNTIL stopFlag = 1
END REPEAT;
CLOSE cur_name;
 
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之前把这个临时变量赋回去就行了

作者“追风刀·丁奇”
 

bitsCN.com
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿