对于间隔分区表(您可能根据ORA-14758 异常使用),您可能会从使用partition_extended_name 语法中受益。
您不需要知道分区名称,您可以使用 DATE 来引用分区,例如
alter table INT_PART drop partition for (DATE'2018-09-01')
所以要删除从当天开始的最后 15 个分区,要执行此循环:
declare
v_sql VARCHAR2(4000);
begin
for cur in (select
trunc(sysdate,'MM') - numtodsinterval(rownum - 1, 'day') my_month
from dual connect by level <= 15)
loop
v_sql := q'[alter table INT_PART drop partition for (DATE']'||
to_char(cur.my_month,'YYYY-MM-DD')||q'[')]';
execute immediate v_sql;
end loop;
end;
/
您必须使用 execute immediate 作为 ALTER TABLE 语句中的 DATE 必须是静态的。
生成并执行以下语句:
alter table INT_PART drop partition for (DATE'2018-09-01')
alter table INT_PART drop partition for (DATE'2018-08-31')
....
alter table INT_PART drop partition for (DATE'2018-08-19')
alter table INT_PART drop partition for (DATE'2018-08-18')
除了 ORA-14758 异常(我忽略 - 请参阅下面的注释)之外,您应该处理异常
ORA-02149: 指定的分区不存在
取决于您的业务,这可能应该被忽略 - 因为这一天不存在分区(并且您永远不会使用分区字典元数据引用这一天)。
注意要解决ORA-14758 Last partition in the range section cannot be dropped 异常,您可以使用这个小技巧。
我创建了一个名为P_MINVALUE 的dummy 分区(没有范围),它在过去扮演间隔开始的角色,因此永远不会被丢弃。
CREATE TABLE int_part
(
transaction_date TIMESTAMP not null,
vc_pad VARCHAR2(100)
)
SEGMENT CREATION DEFERRED
PARTITION BY RANGE (transaction_date) INTERVAL (NUMTODSINTERVAL(1,'DAY'))
(
PARTITION P_MINVALUE VALUES LESS THAN (TO_DATE('2000-01-01', 'YYYY-MM-DD') )
);