业务场景
把2019年申报书,拷贝相关数据并升级成为2020年申报书;
涉及表比较多:bus_report_declaration 申报书表,bus_report_module 模块表,bus_report_set 配置表,bus_report_subtitle 子标题表,bus_report_cascade 级联表等等
update_declaration_2019
CREATE DEFINER=`root`@`%` PROCEDURE `update_declaration_2019`()
BEGIN
-- 申明变量 new_dec_id VARCHAR(32)
DECLARE new_dec_id VARCHAR(32);
DECLARE var_dec_id VARCHAR(32);
DECLARE var_dec_name VARCHAR(500);
DECLARE var_dec_type VARCHAR(6);
DECLARE var_dec_level VARCHAR(6);
DECLARE var_dec_starttime datetime;
DECLARE var_dec_endtime datetime;
DECLARE var_dec_policy VARCHAR(500);
DECLARE var_dec_explain VARCHAR(4000);
DECLARE var_dec_url VARCHAR(200);
DECLARE var_dec_process VARCHAR(200);
DECLARE var_dec_create_by VARCHAR(200);
DECLARE var_data_status VARCHAR(2);
DECLARE var_dec_publish VARCHAR(2);
-- 申明遍历 flag
DECLARE s int DEFAULT 0;
-- 申明游标
DECLARE cur_dec CURSOR FOR SELECT dec_id,dec_name,dec_type,dec_level,dec_starttime,dec_endtime,dec_policy,dec_explain,
dec_url,dec_process,create_by,data_status,dec_publish from bus_report_declaration where dec_year = '2019' and valid_flag = '1';
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打开游标
OPEN cur_dec;
-- 获取数据
fetch cur_dec into var_dec_id,var_dec_name,var_dec_type,var_dec_level,var_dec_starttime,var_dec_endtime,var_dec_policy,var_dec_explain,
var_dec_url,var_dec_process,var_dec_create_by,var_data_status,var_dec_publish;
while s<>1 do
-- 生成的uuid赋值给new_dec_id
SET new_dec_id = replace(uuid(), '-', '');
-- 把申报书新增到数据库中
INSERT INTO bus_report_declaration
(dec_id,dec_name,dec_year,dec_type,dec_level,dec_starttime,dec_endtime,dec_policy,dec_explain,
dec_url,dec_process,create_by,create_time,valid_flag,data_status,dec_publish)
VALUES
(new_dec_id,var_dec_name,'2020',var_dec_type,var_dec_level,var_dec_starttime,var_dec_endtime,var_dec_policy,var_dec_explain,
var_dec_url,var_dec_process,var_dec_create_by,NOW(),'1',var_data_status,var_dec_publish);
-- 当s等于1时表明遍历以完成,退出循环
CALL update_module_2019(var_dec_id,new_dec_id);
-- 获取数据
fetch cur_dec into var_dec_id,var_dec_name,var_dec_type,var_dec_level,var_dec_starttime,var_dec_endtime,var_dec_policy,var_dec_explain,
var_dec_url,var_dec_process,var_dec_create_by,var_data_status,var_dec_publish;
end while;
-- 结束游标
CLOSE cur_dec;
END
update_module_2019
CREATE DEFINER=`root`@`%` PROCEDURE `update_module_2019`(IN `old_dec_id` varchar(36),IN `new_dec_id` varchar(36))
BEGIN
-- 申明遍历 flag
DECLARE s int DEFAULT 0;
DECLARE var_mod_id VARCHAR(32);
DECLARE var_dec_id VARCHAR(32);
DECLARE var_mod_name VARCHAR(200);
DECLARE var_mod_type VARCHAR(6);
DECLARE var_mod_sort int(11);
DECLARE var_mod_explain VARCHAR(2000);
DECLARE var_create_by VARCHAR(32);
DECLARE var_data_status VARCHAR(2);
DECLARE new_mod_id varchar(32);
-- 申明游标
DECLARE cur_mod CURSOR FOR SELECT mod_id,dec_id,mod_name,mod_type,mod_sort,mod_explain,create_by,data_status from bus_report_module where dec_id = old_dec_id AND valid_flag='1';
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
OPEN cur_mod;
-- 赋值
FETCH cur_mod INTO var_mod_id,var_dec_id,var_mod_name,var_mod_type,var_mod_sort,var_mod_explain,var_create_by,var_data_status;
-- 遍历循环
while s<>1 do
-- 生成新的mod_id
SET new_mod_id = replace(uuid(), '-', '');
-- 判断mod_id不为null
IF !ISNULL(var_mod_id) AND LENGTH(trim(var_mod_id))>0 THEN
-- 插入到表
insert into bus_report_module (mod_id,dec_id,mod_name,mod_type,mod_sort,mod_explain,create_by,create_time,valid_flag,data_status,mod_id_at)
VALUES
(new_mod_id,new_dec_id,var_mod_name,var_mod_type,var_mod_sort,var_mod_explain,var_create_by,NOW(),'1',var_data_status,var_mod_id);
-- 调用set
CALL update_set_2019(new_mod_id,new_dec_id,var_mod_id,var_dec_id);
end IF;
-- 赋值
FETCH cur_mod INTO var_mod_id,var_dec_id,var_mod_name,var_mod_type,var_mod_sort,var_mod_explain,var_create_by,var_data_status;
-- 当s等于1时表明遍历以完成,退出循环
end while;
CLOSE cur_mod;
END
update_set_2019
CREATE DEFINER=`root`@`%` PROCEDURE `update_set_2019`(IN `new_mod_id` varchar(32),IN `new_dec_id` varchar(32),
IN `old_mod_id` varchar(32),IN `old_dec_id` varchar(32))
BEGIN
-- 申明遍历 flag
DECLARE s int DEFAULT 0;
DECLARE new_set_id VARCHAR(32);
DECLARE new_sub_id VARCHAR(32);
DECLARE new_cas_id VARCHAR(32);
DECLARE first_sub_id VARCHAR(32) DEFAULT '';
DECLARE var_set_id VARCHAR(32);
DECLARE var_mod_id VARCHAR(32);
DECLARE var_sub_id VARCHAR(32);
DECLARE var_set_sort VARCHAR(32);
DECLARE var_dir_id VARCHAR(32);
DECLARE var_dir_name VARCHAR(100);
DECLARE var_set_type VARCHAR(32);
DECLARE var_cas_id VARCHAR(32);
DECLARE var_set_required_if VARCHAR(2);
DECLARE var_set_instructions VARCHAR(200);
DECLARE var_set_updatetype VARCHAR(200);
DECLARE var_set_placeholder int(11);
DECLARE var_create_by VARCHAR(32);
DECLARE var_data_status VARCHAR(2);
DECLARE cur_set CURSOR FOR SELECT set_id,mod_id,sub_id,set_sort,dir_id,dir_name,set_type,cas_id,set_required_if,set_instructions,set_updatetype,
set_placeholder,create_by,data_status from bus_report_set where dec_id =old_dec_id and mod_id_copy = old_mod_id and valid_flag = '1' ORDER BY sub_id desc;
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 开启游标
OPEN cur_set;
-- 赋值
FETCH cur_set INTO var_set_id,var_mod_id,var_sub_id,var_set_sort,var_dir_id,var_dir_name,var_set_type,var_cas_id,var_set_required_if,
var_set_instructions,var_set_updatetype,var_set_placeholder,var_create_by,var_data_status;
-- 遍历
WHILE s<>1 DO
-- 判断set_id 不为null 或者空串
IF !ISNULL(var_set_id) AND LENGTH(trim(var_set_id))>0 THEN
-- 生成set_id
SET new_set_id = replace(uuid(), '-', '');
-- 如果有子标题;且第一次出现
IF !ISNULL(var_sub_id) AND LENGTH(trim(var_sub_id))>0 AND first_sub_id <> var_sub_id THEN
-- 调用函数,新增子标题到数据库;并返回新的sub_id
SET new_sub_id = update_subtitle_2019(var_sub_id);
SET first_sub_id = var_sub_id;
END IF;
--
IF ISNULL(var_sub_id) or LENGTH(trim(var_sub_id))<1 THEN
SET new_sub_id = '';
END IF;
-- 如果父级联
IF !ISNULL(var_cas_id) AND LENGTH(trim(var_cas_id))>0 THEN
-- 新增子级联;并返回cas_id
SET new_cas_id = update_cascade_byparent_2019(var_cas_id,new_dec_id,new_mod_id,new_sub_id);
-- 新增到数据库
IF !ISNULL(var_mod_id) AND LENGTH(trim(var_mod_id))>0 THEN
INSERT INTO bus_report_set (set_id,dec_id,mod_id,sub_id,set_sort,dir_id,dir_name,set_type,cas_id,set_required_if,set_instructions,set_updatetype,set_placeholder,create_by,create_time,valid_flag,data_status,mod_id_copy) VALUES
(new_set_id,new_dec_id,new_mod_id,new_sub_id,var_set_sort,var_dir_id,var_dir_name,var_set_type,new_cas_id,var_set_required_if,
var_set_instructions,var_set_updatetype,var_set_placeholder,var_create_by,NOW(),'1',var_data_status,new_mod_id);
ELSE
INSERT INTO bus_report_set (set_id,dec_id,mod_id,sub_id,set_sort,dir_id,dir_name,set_type,cas_id,set_required_if,set_instructions,set_updatetype,set_placeholder,create_by,create_time,valid_flag,data_status,mod_id_copy) VALUES
(new_set_id,new_dec_id,'',new_sub_id,var_set_sort,var_dir_id,var_dir_name,var_set_type,new_cas_id,var_set_required_if,
var_set_instructions,var_set_updatetype,var_set_placeholder,var_create_by,NOW(),'1',var_data_status,new_mod_id);
END IF;
END IF;
-- 非子级联
IF (SELECT count(*) FROM `bus_report_cascade` WHERE set_id = var_set_id) = 0 AND (ISNULL(var_cas_id) OR LENGTH(trim(var_cas_id))=0) THEN
-- -- 进行新增;
IF !ISNULL(var_mod_id) AND LENGTH(trim(var_mod_id))>0 THEN
INSERT INTO bus_report_set (set_id,dec_id,mod_id,sub_id,set_sort,dir_id,dir_name,set_type,cas_id,set_required_if,set_instructions,set_updatetype,set_placeholder,create_by,create_time,valid_flag,data_status,mod_id_copy) VALUES
(new_set_id,new_dec_id,new_mod_id,new_sub_id,var_set_sort,var_dir_id,var_dir_name,var_set_type,var_cas_id,var_set_required_if,
var_set_instructions,var_set_updatetype,var_set_placeholder,var_create_by,NOW(),'1',var_data_status,new_mod_id);
ELSE
INSERT INTO bus_report_set (set_id,dec_id,mod_id,sub_id,set_sort,dir_id,dir_name,set_type,cas_id,set_required_if,set_instructions,set_updatetype,set_placeholder,create_by,create_time,valid_flag,data_status,mod_id_copy) VALUES
(new_set_id,new_dec_id,'',new_sub_id,var_set_sort,var_dir_id,var_dir_name,var_set_type,var_cas_id,var_set_required_if,
var_set_instructions,var_set_updatetype,var_set_placeholder,var_create_by,NOW(),'1',var_data_status,new_mod_id);
END IF;
END IF;
END IF;
FETCH cur_set INTO var_set_id,var_mod_id,var_sub_id,var_set_sort,var_dir_id,var_dir_name,var_set_type,var_cas_id,var_set_required_if,
var_set_instructions,var_set_updatetype,var_set_placeholder,var_create_by,var_data_status;
END WHILE ;
CLOSE cur_set;
END
update_subtitle_2019
CREATE DEFINER=`root`@`%` FUNCTION `update_subtitle_2019`(`old_sub_id` varchar(32)) RETURNS varchar(32) CHARSET utf8
BEGIN
DECLARE new_sub_id varchar(32);
SET new_sub_id = replace(uuid(), '-', '');
INSERT INTO bus_report_subtitle(sub_id,sub_name,sub_year,sub_sort,create_by,create_time,valid_flag,data_status,sub_id_at) SELECT
`new_sub_id`,sub_name,sub_year,sub_sort,create_by,NOW(),'1',data_status,`old_sub_id` from bus_report_subtitle WHERE
sub_id = old_sub_id;
RETURN new_sub_id;
END
update_cascade_byparent_2019
CREATE DEFINER=`root`@`%` FUNCTION `update_cascade_byparent_2019`(`old_cas_id` varchar(32),`new_dec_id` varchar(32),
`new_mod_id` varchar(32),`new_sub_id` varchar(32)) RETURNS varchar(32) CHARSET utf8
BEGIN
DECLARE new_set_id varchar(32);
DECLARE new_cas_id varchar(32);
-- 旧的子级联
DECLARE old_set_id varchar(32);
SET new_set_id = replace(uuid(), '-', '');
SET new_cas_id = replace(uuid(), '-', '');
SET old_set_id = (SELECT set_id FROM bus_report_cascade WHERE cas_id = old_cas_id);
IF !ISNULL(old_set_id) AND LENGTH(trim(old_set_id))>0 THEN
-- 新增
INSERT INTO bus_report_cascade (cas_id,set_id) VALUES (new_cas_id,new_set_id);
-- 新增子级联
INSERT INTO bus_report_set (set_id,dec_id,mod_id,sub_id,set_sort,dir_id,dir_name,set_type,cas_id,set_required_if,set_instructions,
set_updatetype,set_placeholder,create_by,create_time,valid_flag,data_status,mod_id_copy) SELECT `new_set_id`,`new_dec_id`,`new_mod_id`,
`new_sub_id`,set_sort,dir_id,dir_name,set_type,'',set_required_if,set_instructions,set_updatetype,set_placeholder,create_by,NOW(),'1',data_status,`new_mod_id` FROM bus_report_set WHERE set_id = old_set_id;
ELSE
SET new_cas_id = '';
END IF ;
RETURN new_cas_id;
END