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 ;

解决方案 »

  1.   

    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
      

  2.   

    双重游标,必须在每个游标都必在BEGIN xxxx 游标使用处---END