mysql存储过程游标(嵌套语句互不影响)
1、在内层语句首设置set d1=d;,尾设置set d=d1;
避免内查询NOT FOUND时d被设置为1从而退出外循环。
2、将内部语句包含在新的begin…end中
设置DECLARE CONTINUE HANDLER FOR NOT FOUND SET d = 0;
内部查询NOT FOUND时d值仍为0,继续外循环。
eg:
begin
DECLARE d int DEFAULT 0;
declare vid int;
declare vserver_contact_id int;
declare vpersonalemail varchar(100);
declare vmobilenum varchar(32);
DECLARE vuserid int(11) default 0;
declare d1 int;
declare cur CURSOR for
select id,server_contact_id,c_personalemail,c_mobilenum from a_user_contactlist_detail where (`matching_userid` IS NULL)
order by id;
#declare continue handler FOR SQLSTATE '02000' SET d = 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET d = 1;
open cur;
lbl:LOOP
FETCH cur into vid,vserver_contact_id,vpersonalemail,vmobilenum;
IF (1 = d) THEN
LEAVE lbl;
END IF;
#set d1=d;
begin
DECLARE CONTINUE HANDLER FOR NOT FOUND SET d = 0;
if (!isnull(vmobilenum)) then
select id_user into vuserid from a_users where mobilenum=vmobilenum limit 1;
end if;
end;
#set d=d1;
if(vuserid>0) then
update a_user_contactlist_detail set matching_userid=vuserid,userid_identifiedtime=now() where id=vid;
end if;
set vuserid=0;
END LOOP lbl;
CLOSE cur;
return 1;
END
参考:
http://bbs.csdn.net/topics/390957741
http://www.cnblogs.com/end/archive/2011/04/15/2016894.html
http://blog.csdn.net/yuri99/article/details/6150055