【发布时间】:2023-03-31 10:49:01
【问题描述】:
我已经写了 1 个Stored Procedure,它应该每天创建新分区,截断分区和超过 9 个月的记录。下面是SP-
create or replace procedure sp_partn as
hm varchar2(255);
mm varchar2(50);
yr varchar2(50);
dd varchar2(10);
ym varchar2(50);
dt varchar2(50);
procedure tbl1_prtn as
begin
for i in (select partition_name, high_value from user_tab_partition where table_name='tbl1')
loop
hm := i.high_value;
mm := substr(hm,6,7);
yr := substr(hm,1,4);
dd := substr(hm,9,10);
ym := yr||mm||dd;
dt := to_date(ym,'yyyymmdd');
if sysdate >= add_months(dt, 9) then
execute immediate 'alter table tbl1 drop partition' || i.partition_name;
end if;
end loop;
end tbl1_prtn;
begin
tbl1_prtn;
end sp_partn;
/
当我在 SP 之上执行时,既不会创建分区也不会删除超过 9 个月的分区。 (例如:tbl_20211116)
【问题讨论】:
-
您可能想尝试间隔分区(无需创建新分区)和extended_partition_names 来引用要删除的分区而不使用分区名称.
-
@MarmiteBomber 所以我需要哈希函数来创建新分区和删除旧分区?
-
不,但您可以在特定月份(日期存储在
my_month)execute immediate q'[alter table TAB drop partition for (DATE']'||to_char(my_month,'YYYY-MM-DD')||q'[')]';中使用类似的内容drop partition -
@MarmiteBomber 不是特定月份,但超过 9 个月将被删除,并且每天都会创建今天的分区日期。
标签: oracle stored-procedures plsql partition