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;
MySQL存储过程(参数:带输入输出参数)
猜你喜欢
转载自blog.csdn.net/bj_chengrong/article/details/103279231
今日推荐
周排行