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