【问题标题】:Procedure to create partition table on daily basis, truncate old partition & records每天创建分区表,截断旧分区和记录的过程
【发布时间】: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_monthexecute 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


【解决方案1】:

如果您将日期存储为日期而不是字符串,这将使您的生活更轻松,您可以使用 INTERVAL PARTITIONs,这将解决您的问题。

SQL> BEGIN
  2     FOR cc IN (SELECT partition_name, high_value --
  3                  FROM user_tab_partitions
  4                 WHERE table_name = 'TEST_TABLE') LOOP
  5        EXECUTE IMMEDIATE
  6           'BEGIN
  7               IF sysdate >= ADD_MONTHS(' || cc.high_value || ', 2) THEN
  8                  EXECUTE IMMEDIATE
  9                     ''ALTER TABLE TEST_TABLE DROP PARTITION '
 10                     || cc.partition_name || '
 11                     '';
 12               END IF;
 13            END;';
 14     END LOOP;
 15  END;
 16  /

【讨论】:

    【解决方案2】:

    运行

    SELECT HIGH_VALUE FROM USER_TAB_PARTITIONS
    

    因为对于日期分区,HIGH_VALUE 通常类似于 "TO_DATE(' 2016-01-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'" 所以我不确定您的 substr 命令将起作用。更好的选择可能是:

    hm := i.high_value;
    execute immediate 'select '||hm||' from dual' into dt;
    

    它将不受字符串位置等的影响。

    【讨论】:

    • 感谢康纳,但我希望超过 9 个月,然后将删除,并且每天都会创建今天的分区日期。所以我认为它不会删除超过 9 个月的分区和记录,它会创建每天的分区日期。
    • 我的建议与您要删除的哪些分区无关。这只是获取给定分区日期的一种更可靠的方法。然后你可以在那个日期做任何你想做的事情(减去 9 个月等)
    • 当我执行 SP 然后在表描述中看不到表的分区名称和索引。
    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2018-02-27
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    相关资源
    最近更新 更多