我有一个基于日期字段的分区表。现在,我必须编写一个程序来删除超过12个月的所有分区。
我在user_tab_partitions表中有以下格式的条目。
PARTITION_NAME HIGH_VALUE
-------------- ----------
SYS_P28468650 20161221
SYS_P28468649 20161220
SYS_P28468648 20161219
SYS_P28468647 20161218
请帮助我了解如何做到这一点
答案 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';