您的位置:首页 > 数据库 > MySQL

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

2016-10-18 14:49 363 查看
有两张表 建筑务表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





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐