在DB2存储过程中从表中自动输入参数。

问题描述 投票:0回答:1

我正在使用这里所示的存储过程,通过参数化表名、提交次数和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

也请对存储过程提出任何修改建议。

sql stored-procedures db2 db2-luw
1个回答
0
投票

出于兴趣,你可以在DELETE中使用这种风格的DELETE来避免代价高昂的自连接。

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

而且,如果您真的想要高效地清除行,您可以考虑使用MDC滚动删除。

https:/www.ibm.comsupportknowledgecenterSSEPGG_11.5.0com.ibm.db2.luw.admin.perf.docdocc0007338.html

© www.soinside.com 2019 - 2024. All rights reserved.