mysql游标处理复杂逻辑,分支结构代码示例

有两张表  建筑务表d_unit_info  跟 d_unit_person_info 人员表  两张表的关联字段为 duiId


需求:通过d_unit_info表关联d_unit_person_info 查询 d_unit_person_info 表中suptId 如果等于9则忽略当前建筑

如果没有则将suptId = 2 的记录新增至当前表中,并根据duiId号码 + 根据建筑编码查询出当前建筑在表中有几条记录 + 00001 下一条+00002  的方式生成主健ID,并且 d_unit_info.DUI_IsTest = 0


实现方式:首选游标


1,首先遍历单位表 d_unit_info 查询出所有单位编码即duiId 并同时过滤掉所有 DUI_IsTest != 0 记录,将查询结果

放入游标内,代码如下;

DECLARE getSave CURSOR FOR SELECT a.dui_id FROM d_unit_info a WHERE a.DUI_IsTest = '0';
</pre><pre name="code" class="sql">

2,根据游标内的单位编码duiId 遍历d_unit_person_info 人员表 并查看该单位有没有suptId等于9的记录,将结果

记录在过程内定义的局部变量couNum中,代码如下;

set couNum := (select count('x') from d_unit_person_info a where a.dui_id = p_DUI_ID and a.SUPT_ID = '9');

3,判断couNum的值,若 <=0 则说明该单位没有suptId=9的记录,那么先将d_unit_person_info表中的所有单位进行统计,再加指定的方式生成 00001 这种字符串, 公式: 统计结果+1  字符串总长度5位 左边补零,

最后再用duiId拼接刚用公式动态产生的字符串,将最终结果存入过程中的局部变量 p_dupi_id中,

他的用处是充单主健的角色,

代码如下;


            #是否存在消防安全联系人 如果存在则不处理 否则copy条消防管理人员记录给消防安全联系人
					if couNum<=0 then 
							SET couNum := (SELECT LPAD(count(*)+1,5,0) FROM d_unit_person_info info WHERE info.DUI_ID = p_DUI_ID);
							set p_dupi_id := CONCAT(p_DUI_ID,couNum);


4,最后向d_unit_person_info新增所需要的数据,主健为 p_dupi_id 也就是刚刚自已动态生成的, supt_id为9,

其它数据通过游标内保存的单位编码duiId 再次遍历d_unit_person_info表所获得,

并且只要suptId=2的记录,代码如下;


insert into d_unit_person_info 
							select p_dupi_id,DUI_ID,'9',p.SUWT_ID,p.DUTI_ID,p.DUHI_ID,p.SPCT_ID,p.DUPI_Name,p.DUPI_Sn,p.DUPI_Sex,
							p.DUPI_Birthday,p.DUPI_Duty,p.DUPI_Tel,p.DUPI_Photo,p.SET_ID,p.DUPI_Dept,p.DUPI_EntryDate,p.DUPI_IsTrain,p.DUPI_TrainDate,
							p.DUPI_CertificateNo,p.DUPI_ValidityDate,p.DUPI_CertificateDate,p.DUPI_IsEvacuation,p.DUPI_Area,p.DUPI_House_Duty,
							p.Valid,p.View_Seq,p.Modify_Date,p.Modifyer from d_unit_person_info p where p.dui_id = p_dui_id and p.supt_id = '2' 
								order by dupi_id LIMIT  1,1;



5,所有代码如下所示;


DROP PROCEDURE IF EXISTS `p3`; 
CREATE PROCEDURE p3()
BEGIN
  DECLARE p_DUPI_ID VARCHAR(32);
  DECLARE p_DUI_ID VARCHAR(32);
	declare stopFlag int default 0;
	DECLARE couNum int;
	DECLARE getSave CURSOR FOR SELECT a.dui_id FROM d_unit_info a WHERE a.DUI_IsTest = '0';
	declare continue handler for not found set stopFlag = 1;

  begin
		ROLLBACK;
	end;

	OPEN getSave;

	REPEAT
	FETCH getSave INTO p_DUI_ID;
	IF(stopFlag<>1) then
		START TRANSACTION;
			set couNum := (select count('x') from d_unit_person_info a where a.dui_id = p_DUI_ID and a.SUPT_ID = '9');
 
            #是否存在消防安全联系人 如果存在则不处理 否则copy条消防管理人员记录给消防安全联系人
					if couNum<=0 then 
							SET couNum := (SELECT LPAD(count(*)+1,5,0) FROM d_unit_person_info info WHERE info.DUI_ID = p_DUI_ID);
							set p_dupi_id := CONCAT(p_DUI_ID,couNum);

							insert into d_unit_person_info 
							select p_dupi_id,DUI_ID,'9',p.SUWT_ID,p.DUTI_ID,p.DUHI_ID,p.SPCT_ID,p.DUPI_Name,p.DUPI_Sn,p.DUPI_Sex,
							p.DUPI_Birthday,p.DUPI_Duty,p.DUPI_Tel,p.DUPI_Photo,p.SET_ID,p.DUPI_Dept,p.DUPI_EntryDate,p.DUPI_IsTrain,p.DUPI_TrainDate,
							p.DUPI_CertificateNo,p.DUPI_ValidityDate,p.DUPI_CertificateDate,p.DUPI_IsEvacuation,p.DUPI_Area,p.DUPI_House_Duty,
							p.Valid,p.View_Seq,p.Modify_Date,p.Modifyer from d_unit_person_info p where p.dui_id = p_dui_id and p.supt_id = '2' 
								order by dupi_id LIMIT  1,1;
					end if;
		COMMIT;
		END IF;

		UNTIL stopFlag=1 
		END REPEAT;
	
	CLOSE getSave;
END 







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值