关于 mysql 存储过程内循环如何嵌套循环,也是在博主历经一番研究后,终于搞出来了,废话不多说,上干货。
博主是用的REPEAT +while实现的嵌套循环,说实话,mysql存储过程这个功能有待完善,太多坑了。
废话不多说,看代码:
CREATE DEFINER=`root`@`%` PROCEDURE `A`(dateTime varchar(100))
BEGIN--  参数 dateTime (格式 yyyy-MM)-- 外层循环结束标识
DECLARE done BOOLEAN DEFAULT FALSE;
-- 内层循环结束标识
DECLARE edone BOOLEAN DEFAULT FALSE;DECLARE v_deptId varchar(64);
DECLARE v_centerCode varchar(64);
DECLARE v_centerName varchar(64);DECLARE v_dictLabel varchar(64);
DECLARE v_dictValue varchar(64);--  内循环次数
DECLARE in_Num BIGINT(12);-- 内循环游标
DECLARE insideInfo CURSOR FOR
select dict_label,dict_value 
from 表A   a where  dict_type='other_item' and status='0';-- 外循环游标
DECLARE dayInfo CURSOR FOR
select sd.dept_id,sd.center_code,bc.center_name 
from 表B
where  sd.center_code=bc.center_code and  sd.status='0' and sd.del_flag='0'  and sd.dept_level='3';-- 外循环结束标识
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=TRUE;-- 开启事务
START TRANSACTION;delete  from 表C;--  开启外循环标识:循环站点OPEN dayInfo;REPEATFETCH dayInfo INTO v_deptId,v_centerCode,v_centerName;IF !done THEN--   业务sqlINSERT INTO 表C(one_type,two_type,dept_id,center_code,center_name, pro_name,month,year, create_by, create_time,pro_income, people_num)(select  "1","q", v_deptId,v_centerCode,v_centerName,'基础业务',	dateTime,left(dateTime,4),'admin',SYSDATE(),ts.pro_income,ts.people_num from (select ifnull(sum(round(work_money,2)),0) as pro_income,ifnull(count(DISTINCT bc_id),0) as people_numfrom 表Dwhere 字段A=v_deptId and 字段B= v_centerCodeand  DATE_FORMAT(字段C,'%Y-%m')=dateTime ) ts );-- 开启内循环:对外循环的每个对象进行内循环OPEN insideInfo;FETCH insideInfo INTO v_dictLabel,v_dictValue;
SET @j=1;WHILE @j<=in_Num DOINSERT INTO 表C (one_type,two_type,dept_id,center_code,center_name, pro_name,month,year, create_by, create_time,people_num, pro_income)(select "3",v_dictValue,v_deptId,v_centerCode,v_centerName,v_dictLabel,dateTime,left(dateTime,4),'admin',SYSDATE(),0,ts.pro_incomefrom (select ifnull(sum(round(bo.income_money,2)),0) as pro_incomefrom 表E where  bo.dept_id=v_deptId and bo.center_code= v_centerCode  and bo.item=v_dictValue and  DATE_FORMAT(check_time,'%Y-%m')=dateTime  ) ts );SET @j=@j+1;END while;		 --  结束循环CLOSE insideInfo;END IF;--  结束循环UNTIL done END REPEAT;CLOSE dayInfo;COMMIT;END