MySQL存储过程(参数:带输入输出参数)

DROP PROCEDURE IF EXISTS PRO_DATA_MIGRATION;
CREATE PROCEDURE PRO_DATA_MIGRATION (
	IN I_KEEP_DAYS INT,
  IN I_EXEC_FIELD VARCHAR (64),
	IN I_NAME_TABLES VARCHAR (128),
	OUT O_ERROR_MSG VARCHAR (2048)
)
BEGIN 
/**
 * 功能描述:数据迁移存储过程
 * 参数描述:I_KEEP_DAYS:	需要保留的天数
 * 					 I_EXEC_FIELD:	当前表用于判断的日期字段
 * 					 I_NAME_TABLES:需要执行的表对象
 * 					 O_ERROR_MSG:	存储过程输出参数
 * @AUTHORS:CHENEY
 * @DATE:2019-11-27
 */
-- Declare variables to hold diagnostics area information
DECLARE T_NEW_TABLE_OBJ_1 VARCHAR (64) DEFAULT '';
DECLARE T_NEW_TABLE_OBJ_2 VARCHAR (64) DEFAULT CONCAT(I_NAME_TABLES,'_move');
DECLARE T_ERROR_MSG VARCHAR (1024) DEFAULT '';
DECLARE ERROR_COUNT INT;
/* 自定义控制游标循环变量,默认FALSE */
DECLARE T_STATUS_V INT DEFAULT FALSE; 
/* 判断当前表是否自动创建存在,不存在需要输出错误消息 */
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN 
/* 设置错误缓冲区的内容,主要是针对T-SQL语法错误进行缓冲输出, */
GET CURRENT DIAGNOSTICS ERROR_COUNT = NUMBER;
IF ERROR_COUNT <> 0 THEN
	GET CURRENT DIAGNOSTICS CONDITION 1 ERROR_COUNT = MYSQL_ERRNO, T_ERROR_MSG = MESSAGE_TEXT;
END IF ;
/* 需要获取诊断区中的内容时,一定要从堆栈诊断区中获取,而不是当前诊断区*/
GET STACKED DIAGNOSTICS CONDITION 1 ERROR_COUNT = MYSQL_ERRNO, T_ERROR_MSG = MESSAGE_TEXT;
/* 把SQL执行异常实时监控打印返回 */
IF T_ERROR_MSG <> '' THEN
	SET T_STATUS_V = TRUE;
	SET O_ERROR_MSG = T_ERROR_MSG;
END IF;
/* 判断对应的目标对象表是否存在 */
SELECT TABLE_NAME INTO T_NEW_TABLE_OBJ_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = T_NEW_TABLE_OBJ_2;
	IF T_NEW_TABLE_OBJ_1 = '' OR T_NEW_TABLE_OBJ_1 IS NULL THEN
		SET T_STATUS_V = TRUE;
		SET T_ERROR_MSG = concat('异常:未找到表:[',I_NAME_TABLES,']的迁移备份目标对象,请创建远程映射对象[',T_NEW_TABLE_OBJ_2,']');
		IF T_STATUS_V = TRUE THEN 
			SET O_ERROR_MSG = T_ERROR_MSG;
		END IF;
	END IF;
END;
/* 动态组装可执行的迁移数据的T-SQL */
START TRANSACTION;
	BEGIN
		IF T_STATUS_V = FALSE THEN 
			SET @T_MOVE_TRANSFER_MOVE = '';
			SET @T_MOVE_TRANSFER_MOVE = concat('INSERT INTO ',T_NEW_TABLE_OBJ_2,' SELECT * FROM ',I_NAME_TABLES,' WHERE ',I_EXEC_FIELD,' < date_sub(current_timestamp(),interval ',I_KEEP_DAYS,' day)');
			PREPARE T_MOVE_TRANSFER_EXEC FROM @T_MOVE_TRANSFER_MOVE;
			EXECUTE T_MOVE_TRANSFER_EXEC;
			DEALLOCATE PREPARE T_MOVE_TRANSFER_EXEC;
		END IF;
	END;
	/* 迁移完成后,动态组装可执行的需要清理[保留I_KEEP_DAYS天]数据 */
	BEGIN
		SET @T_MOVE_TRANSFER_DEL = '';
		SET @T_MOVE_TRANSFER_DEL = concat('DELETE FROM ',I_NAME_TABLES,' WHERE STR_TO_DATE(',I_EXEC_FIELD,',\'%Y-%m-%d %H:%i:%s\') < date_sub(current_timestamp(),interval ',I_KEEP_DAYS,' day)');
		PREPARE T_DEL_TRANSFER_EXEC FROM @T_MOVE_TRANSFER_DEL;
		EXECUTE T_DEL_TRANSFER_EXEC;
		DEALLOCATE PREPARE T_DEL_TRANSFER_EXEC;
	END;
END;

猜你喜欢

转载自blog.csdn.net/bj_chengrong/article/details/103279231