如何写一个程序来删除超过12个月的所有分区?

时间:2017-05-15 13:18:53

标签: oracle

我有一个基于日期字段的分区表。现在,我必须编写一个程序来删除超过12个月的所有分区。

我在user_tab_partitions表中有以下格式的条目。

PARTITION_NAME      HIGH_VALUE
--------------      ----------
SYS_P28468650       20161221
SYS_P28468649       20161220
SYS_P28468648       20161219
SYS_P28468647       20161218

请帮助我了解如何做到这一点

1 个答案:

答案 0 :(得分:0)

看起来分区是基于数字而不是DATE值。

无论如何,这样的程序应该有效:

DECLARE

    HighValue NUMBER;

    CURSOR TabPartitions IS
    SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE
    FROM USER_TAB_PARTITIONS 
    WHERE TABLE_NAME = 'YOUR_TABLE'
    ORDER BY TABLE_NAME, PARTITION_POSITION;

BEGIN

    FOR aPart IN TabPartitions LOOP
        EXECUTE IMMEDIATE 'BEGIN :ret := '||aPart.HIGH_VALUE||'; END;' USING OUT HighValue;
        IF TO_DATE(HighValue, 'YYYYMMDD') < ADD_MONTHS(SYSDATE, -12) THEN
            EXECUTE IMMEDIATE 'ALTER TABLE YOUR_TABLE DROP PARTITION '||aPart.PARTITION_NAME||' UPDATE GLOBAL INDEXES';
        END IF;     
    END LOOP;

END;

您也可以使用

EXECUTE IMMEDIATE 'ALTER TABLE YOUR_TABLE DROP PARTITION FOR ('||aPart.PARTITION_NAME||') UPDATE GLOBAL INDEXES';