您好,欢迎光临! 推荐您使用Chrome浏览器访问本站。

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

您可能也喜欢