mysql存储过程 双层游标嵌套循环

长腿蜗牛 2013-09-18 11:31:29
DELIMITER $$
CREATE PROCEDURE policy_count()
BEGIN
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS func_policy -- 不存在则创建临时表
(
temppolicycode VARCHAR(30),
tempsigns VARCHAR(30),
tempcity VARCHAR(30),
temparea VARCHAR(30),
temptradetype VARCHAR(30),
temptradeclass VARCHAR(30),
tempallmoney VARCHAR(30),
tempendmonth VARCHAR(30),
tempendyear VARCHAR(30)
);
TRUNCATE TABLE func_policy; -- 使用前先清空临时表。
BEGIN#定义游标指定列属性
DECLARE signs VARCHAR(30) DEFAULT '' ;
DECLARE policycode VARCHAR(30) DEFAULT '' ;
DECLARE city VARCHAR(30) DEFAULT '' ;
DECLARE AREA VARCHAR(30) DEFAULT '' ;
DECLARE tradeclass VARCHAR(30) DEFAULT '' ;
DECLARE tradetype VARCHAR(30) DEFAULT '' ;
DECLARE allmoney VARCHAR(30) DEFAULT '' ;
DECLARE endmonth VARCHAR(30) DEFAULT '' ;
DECLARE endyear VARCHAR(30) DEFAULT '' ;
DECLARE policydate VARCHAR(30) DEFAULT '' ;
DECLARE endorsecode VARCHAR(30) DEFAULT '' ;
DECLARE signtime VARCHAR(30) DEFAULT '' ;
DECLARE changmoney VARCHAR(30) DEFAULT '' ;
DECLARE endorsedate VARCHAR(30) DEFAULT '' ;
DECLARE 1_policycode VARCHAR(30) DEFAULT '' ;
DECLARE 1_signs VARCHAR(30) DEFAULT '' ;
DECLARE 1_city VARCHAR(30) DEFAULT '' ;
DECLARE 1_AREA VARCHAR(30) DEFAULT '' ;
DECLARE 1_tradeclass VARCHAR(30) DEFAULT '' ;
DECLARE 1_tradetype VARCHAR(30) DEFAULT '' ;
DECLARE 1_allmoney VARCHAR(30) DEFAULT '' ;
DECLARE endorsemonth VARCHAR(30) DEFAULT '' ;
DECLARE endorseyear VARCHAR(30) DEFAULT '' ;
DECLARE 1_policydate VARCHAR(30) DEFAULT '' ;
DECLARE done INT DEFAULT 0;
DECLARE edone INT DEFAULT 0;
#向临时表插入数据
INSERT INTO func_policy(temppolicycode,tempsigns,tempcity,temparea,temptradetype,temptradeclass,tempallmoney,tempendmonth,tempendyear)
SELECT p.policycode,COUNT(*),p.city,p.area,p.tradetype,p.tradeclass, SUM(p.allmoney),MONTH(p.policytime),YEAR(p.policytime)
FROM sr_policy p WHERE p.totalflag = '0' OR p.totalflag = NULL
GROUP BY p.policycode,p.city,p.area,p.tradeclass,p.tradetype;
BEGIN
#定义保单数据游标
DECLARE policy_cusor CURSOR FOR SELECT p.temppolicycode,p.tempsigns,p.tempcity,p.temparea,p.temptradetype,p.temptradeclass,p.tempallmoney,p.tempendmonth,p.tempendyear
FROM func_policy p;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;#结束标识
OPEN policy_cusor;
policySeqLoop:LOOP#循环保单数据游标
FETCH policy_cusor INTO policycode,signs,city,AREA,tradetype,tradeclass,allmoney,endmonth,endyear;
IF done = 1 THEN
LEAVE policySeqLoop;#跳出循环
ELSE
BEGIN
#定义批单数据游标
DECLARE endors_cusor CURSOR FOR SELECT e.endorsecode,e.signtime,e.policycode AS policycode,e.city AS city,e.area AS AREA,e.tradeclass AS tradeclass,e.tradetype AS tradetype, e.changemoney AS changmoney,
e.allmoney AS allmoney,MONTH(e.signtime) AS endorsemonth,YEAR(e.signtime) AS endorseyear FROM sr_endorse e;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET edone = 1;#结束标识
OPEN endors_cusor;
endorsSeqLoop:LOOP#循环批单数据
FETCH endors_cusor INTO endorsecode,signtime,1_policycode,1_city,1_AREA,1_tradeclass,1_tradetype,changmoney,1_allmoney,endorsemonth,endorseyear;
IF edone = 1 THEN
LEAVE endorsSeqLoop;
ELSE
UPDATE sr_endorse se SET se.totalflag = '1' WHERE se.endorsecode = endorsecode;
IF policycode = 1_policycode THEN#保单和批单中的保单号相同时
IF city = 1_city
AND AREA = 1_AREA
AND tradeclass = 1_tradeclass
AND tradetype = 1_tradetype
AND endmonth = endorsemonth
AND endyear = endorseyear THEN#只有保费发生变化时
UPDATE func_policy pc SET pc.tempallmoney = pc.tempallmoney + changmoney
WHERE pc.temppolicycode = policycode;
ELSE
UPDATE func_policy fp SET fp.tempcity = 1_city,fp.temparea = 1_AREA,fp.temptradetype = 1_tradetype,
fp.temptradeclass = 1_tradeclass,fp.tempallmoney = 1_allmoney,fp.tempendmonth = endorsemonth,
fp.tempendyear = endorseyear WHERE fp.temppolicycode = policycode;
END IF;
END IF;
END IF;
END LOOP;
CLOSE endors_cusor;
END;
UPDATE sr_policy a SET a.totalflag = '1' WHERE a.policycode = policycode;
END IF;
END LOOP;
CLOSE policy_cusor;
#统计保单数据
INSERT INTO sr_policy_count(signs,city,AREA,tradetype,tradeclass,allmoney,endmonth,endyear)
SELECT SUM(fp.tempsigns),fp.tempcity,fp.temparea,fp.temptradetype,fp.temptradeclass,SUM(fp.tempallmoney),fp.tempendmonth,fp.tempendyear
FROM func_policy fp GROUP BY fp.tempcity,fp.temparea,fp.temptradetype,fp.temptradeclass,fp.tempendmonth,fp.tempendyear;
COMMIT;
END;
END;
END;
END$$
DELIMITER ;
...全文
1001 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
乐创 2014-10-22
  • 打赏
  • 举报
回复
双重游标,必须在每个游标都必在BEGIN xxxx 游标使用处---END
ACMAIN_CHM 2014-09-16
  • 打赏
  • 举报
回复
楼主分享了一段代码的目的是什么?
iukcy 2014-09-16
  • 打赏
  • 举报
回复
楼主,你的胃安好?
alice_lee_32 2013-09-18
  • 打赏
  • 举报
回复
使用游标会很慢的。还双重嵌套。
alice_lee_32 2013-09-18
  • 打赏
  • 举报
回复
INSERT INTO func_policy(temppolicycode,tempsigns,tempcity,temparea,temptradetype,temptradeclass,tempallmoney,tempendmonth,tempendyear) SELECT p.policycode,COUNT(*),p.city,p.area,p.tradetype,p.tradeclass, SUM(p.allmoney),MONTH(p.policytime),YEAR(p.policytime) FROM sr_policy p WHERE p.totalflag = '0' OR p.totalflag = NULL GROUP BY p.policycode,p.city,p.area,p.tradeclass,p.tradetype; 应该是 p.totalflag is NULL

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧