You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:45:19