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

mysql循环(嵌套) 过程(带返回值)

DECLARE _cur CURSOR FOR SELECT语句
–第一种循环:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET loop_done=1;
OPEN _cur;
REPEAT
FETCH filedmsglist INTO 变量;
IF NOT loop_done THEN
–处理语句
END IF;
UNTIL loop_done END REPEAT;
CLOSE _cur;
–第二种循环:
open _cur;
loop_cur:loop
fetch _cur into 变量;
if _done=1 then
leave loop_cur;
end if;
–处理语句
end loop;
close _cur;
一个完整的嵌套循环例子(带返回值):

CREATE DEFINER=`root`@`localhost` PROCEDURE
`process_tag_filedmsg`(OUT `str_result` VARCHAR(512))
BEGIN
DECLARE fid int;
DECLARE frommsg varchar(255);
DECLARE tomsg varchar(255);
DECLARE ccmsg varchar(255);
DECLARE addr varchar(255);
DECLARE userid int;
DECLARE contexttagid int;
DECLARE classtypeid int;
DECLARE hemail varchar(255);
DECLARE loop_done int default 0;

DECLARE str varchar(255) default "";

DECLARE filedmsglist CURSOR FOR
SELECT am.id,am.from_msg,am.to_msg,am.cc_msg
FROM filedmsg am WHERE (am.checktag IS NULL)
OR (am.checktag =0) ORDER BY am.msg_date ASC ;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET loop_done=1;
OPEN filedmsglist;
   REPEAT
   FETCH filedmsglist INTO fid,frommsg, tomsg, ccmsg;
   IF NOT loop_done THEN

   BEGIN
   DECLARE loop_done1 int default 0;
   DECLARE contactmgmtlist CURSOR FOR
    SELECT c.user_id,c.contexttag_id , c.classtype_id,b.h_email
    FROM contactmgmt c, awm_addr_book b
    WHERE c.addr_id = b.id_addr;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET loop_done1=1;
   OPEN contactmgmtlist;
     REPEAT
     FETCH contactmgmtlist INTO userid,contexttagid,classtypeid,hemail;
     IF NOT loop_done1 THEN
        IF (FIND_IN_SET(hemail,CONCAT(frommsg,',',tomsg,',',ccmsg))) THEN
           INSERT INTO msgcontexttag
            (msg_id,contexttag_id,classtype_id,tagname,msgdesc,user_id)
            (select fid,contexttagid,classtype_id,tagname,tagdesc,userid
            from contexttag where id=contexttagid);
           update filedmsg set checktag=1 where id=fid;
        END IF;
        --set str=CONCAT(str,hemail);
     END IF;
    UNTIL loop_done1 END REPEAT;
  CLOSE contactmgmtlist;
  END;
 -- set str=CONCAT(str,frommsg);

END IF;
 UNTIL loop_done END REPEAT;
CLOSE filedmsglist;
set str_result=str;
END

调用:call process_tag_filedmsg(@a);
select @a;
更多参考:
http://shansun123.iteye.com/blog/1026084
http://blog.csdn.net/a600423444/article/details/6424360

您可能也喜欢