Oracle 如何编写一个过程来删除所有超过12个月的分区?
我有一个基于日期字段的分区表。现在,我必须编写一个过程来删除所有超过12个月的分区 我在user\u tab\u partitions表中有以下格式的条目Oracle 如何编写一个过程来删除所有超过12个月的分区?,oracle,Oracle,我有一个基于日期字段的分区表。现在,我必须编写一个过程来删除所有超过12个月的分区 我在user\u tab\u partitions表中有以下格式的条目 PARTITION_NAME HIGH_VALUE -------------- ---------- SYS_P28468650 20161221 SYS_P28468649 20161220 SYS_P28468648 20161219 SYS_P28468647 201
PARTITION_NAME HIGH_VALUE
-------------- ----------
SYS_P28468650 20161221
SYS_P28468649 20161220
SYS_P28468648 20161219
SYS_P28468647 20161218
请帮助我做这件事看起来分区是基于数字的,而不是日期值 无论如何,像这样的程序应该是可行的:
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;
感谢第1行ORA-01847的rply错误:月日必须介于1和月的最后一天之间ORA-06512:在“系统标准”中,第167行ORA-06512:在第11Is行中是否正在工作?如果不是,分区键的数据类型是什么?根据您的示例,它似乎是
NUMBER
。它是日期
还是时间戳
?分区键是数字(38)数据类型,并采用以下YYYYMMDD格式。
EXECUTE IMMEDIATE 'ALTER TABLE YOUR_TABLE DROP PARTITION FOR ('||aPart.PARTITION_NAME||') UPDATE GLOBAL INDEXES';