Teradata存储过程按序执行表中DELETE语句并记录删除行数
Teradata存储过程实现按配置执行DELETE并记录删除行数
前置准备:创建执行日志表
首先创建独立的日志表,用于存储每条DELETE语句的执行结果,参考建表语句:
CREATE MULTISET TABLE t_delete_exec_log ( exec_seq INTEGER, -- 对应配置表C2的执行顺序编号 exec_sql VARCHAR(10000), -- 实际执行的DELETE语句原文 deleted_row_cnt BIGINT, -- 该语句实际删除的数据行数 exec_time TIMESTAMP(3), -- 语句执行完成时间 exec_status VARCHAR(10), -- 执行状态:SUCCESS/FAILED err_msg VARCHAR(1000) -- 执行失败时的错误信息 ) PRIMARY INDEX (exec_seq);
存储过程实现代码
核心实现逻辑:
- 按C2字段升序拉取所有C3标识为
Y的待执行语句,自动跳过标识为N的记录 - 逐条动态执行C1字段存储的DELETE语句,通过Teradata内置变量
ACTIVITY_COUNT获取语句影响的行数 - 增加异常容错逻辑,单条语句执行失败时记录错误信息,不中断后续语句执行
REPLACE PROCEDURE sp_exec_config_delete() BEGIN -- 定义流程变量 DECLARE v_sql VARCHAR(10000); DECLARE v_seq INTEGER; DECLARE v_del_cnt BIGINT; DECLARE v_sqlstate CHAR(5); DECLARE v_err_code INTEGER; DECLARE v_err_msg VARCHAR(1000); -- 定义游标:按执行顺序读取所有启用的DELETE语句 DECLARE cur_delete_stmt CURSOR FOR SELECT C2, C1 FROM T1 WHERE C3 = 'Y' ORDER BY C2 ASC; -- 定义异常处理器:单条语句报错时记录失败日志,继续执行后续语句 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN SET v_sqlstate = SQLSTATE; SET v_err_code = SQLCODE; SET v_err_msg = 'SQL错误,代码:' || TRIM(CAST(v_err_code AS VARCHAR(20))) || ' 状态码:' || v_sqlstate; INSERT INTO t_delete_exec_log (exec_seq, exec_sql, deleted_row_cnt, exec_time, exec_status, err_msg) VALUES (v_seq, v_sql, 0, CURRENT_TIMESTAMP(3), 'FAILED', v_err_msg); END; -- 打开游标开始循环执行 OPEN cur_delete_stmt; LABEL_EXEC_LOOP: LOOP FETCH cur_delete_stmt INTO v_seq, v_sql; -- 游标遍历完成则退出循环 IF SQLSTATE = '02000' THEN LEAVE LABEL_EXEC_LOOP; END IF; -- 初始化参数,执行动态DELETE SET v_del_cnt = 0; SET v_err_msg = NULL; EXECUTE IMMEDIATE v_sql; -- 执行成功时获取删除行数,写入成功日志 IF v_err_msg IS NULL THEN SET v_del_cnt = ACTIVITY_COUNT; INSERT INTO t_delete_exec_log (exec_seq, exec_sql, deleted_row_cnt, exec_time, exec_status, err_msg) VALUES (v_seq, v_sql, v_del_cnt, CURRENT_TIMESTAMP(3), 'SUCCESS', NULL); END IF; -- 单条语句执行完提交,避免长事务锁表 COMMIT; END LOOP LABEL_EXEC_LOOP; CLOSE cur_delete_stmt; END;
调用方式
直接执行存储过程即可触发全流程:
CALL sp_exec_config_delete();
效果验证
针对你给出的示例配置数据,执行后结果符合预期:
- 自动跳过C2=3、C3=N的
delete from Z语句,按1→2→4的顺序执行剩余三条DELETE - 日志表中会逐条记录三条语句的删除行数、执行时间,正常执行的语句状态标记为SUCCESS
- 若某条语句存在语法错误、权限不足等问题,会在日志表标记FAILED状态和错误原因,不影响剩余语句执行
内容的提问来源于stack exchange,提问作者Anchit Jain
相关产品推荐
相关产品推荐

