mariadb存儲過程與函數,實戰

業務場景

把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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章