【问题标题】:Automating parameter inputs from table in DB2 stored procedure在 DB2 存储过程中自动化表中的参数输入
【发布时间】:2020-10-04 04:27:09
【问题描述】:

我正在使用此处显示的存储过程通过参数化表名、提交计数和 where 条件来删除 12 个大表。我已将这 3 条信息插入到一个名为 PURGE_DEL 的表中,该表有 12 行,我想要一些建议,如何通过一个接一个地读取表来自动从 12 个表中删除。

有点像

表名:PURGE_DEL

CALL DELETE_DATA(PURGE_DEL.TABLE_NAME, PURGE_DEL.COMMIT_COUNT, PURGE_DEL.WHERE)

代码:

CREATE PROCEDURE DELETE_DATA
(IN V_TABLE_NAME VARCHAR(24), 
IN V_COMMIT_COUNT INTEGER, 
IN V_WHERE_CONDITION VARCHAR(1024))

DYNAMIC RESULT SETS 01
COMMIT ON RETURN NO
LANGUAGE    SQL
NOT DETERMINISTIC

L3 : BEGIN

-- DECLARE STATEMENTS
DECLARE SQLCODE INTEGER;
DECLARE V_DELETE_QUERY VARCHAR(1024);
DECLARE V_DELETE_STATEMENT STATEMENT;

SET V_DELETE_QUERY = 'DELETE FROM ' || V_TABLE_NAME || 
' WHERE COLUMN IN (SELECT COLUMN FROM  ' 
|| V_TABLE_NAME ||  'WHERE COLUMN_ID =' 
|| V_WHERE_CONDITION  || ' FETCH FIRST ' 
|| RTRIM(CHAR(V_COMMIT_COUNT)) || ' ROWS ONLY) ';

PREPARE V_DELETE_STATEMENT FROM V_DELETE_QUERY;
DEL_LOOP:
    LOOP
        EXECUTE V_DELETE_STATEMENT;
        IF SQLCODE = 100 THEN
            LEAVE DEL_LOOP; 
        END IF;
        COMMIT;
    END LOOP;

COMMIT;
END L3

还请对存储过程提出任何更改建议。

【问题讨论】:

  • 您已经在之前的帖子中获得了解决方案。这很难适应 FOR 循环在其中调用您的例程吗?

标签: sql stored-procedures db2 db2-luw


【解决方案1】:

出于兴趣,您可以通过使用这种 DELETE 样式避免在 DELETE 中进行代价高昂的自联接

DELETE FROM (
    SELECT 1 FROM TABLE_NAME
    WHERE WHERE_CONDITION  
    FETCH FIRST 50000 ROWS ONLY
)

如果您确实想要有效地清除行,您可以考虑使用 MDC 转出删除

https://www.ibm.com/support/knowledgecenter/SSEPGG_11.5.0/com.ibm.db2.luw.admin.perf.doc/doc/c0007338.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多