create or replace procedure test
  as
    query_str  varchar2(4000);
    CURSOR PartSet IS SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='TRAININFO' and substrb(PARTITION_NAME,-8)<to_char(sysdate-30,'yyyymmdd');
  begin
      FOR thisPart IN PartSet LOOP
          query_str :='ALTER TABLE TRAININFO DROP PARTITION '||thisPart.PARTITION_NAME;
          execute immediate query_str;
          insert into a values(sysdate);
          commit;
      END LOOP;
  end;
/
这是删除30天前的所有分区

解决方案 »

  1.   

    考虑性能问题,我建议在drop分区前先truncate分区
    create or replace procedure test
      as
        query_str  varchar2(4000);
        CURSOR PartSet IS SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='TRAININFO' and substrb(PARTITION_NAME,-8)<to_char(sysdate-30,'yyyymmdd');
      begin
          FOR thisPart IN PartSet LOOP
              query_str :='ALTER TABLE TRAININFO TRUNCATE PARTITION '||thisPart.PARTITION_NAME;
              execute immediate query_str;
     query_str :='ALTER TABLE TRAININFO DROP PARTITION '||thisPart.PARTITION_NAME;
              execute immediate query_str;
              insert into a values(sysdate);
              commit;
          END LOOP;
      end;
    /
      

  2.   

    to nowait(独行天涯路):  在drop分区前先truncate分区能提高性能?能不能解释的具体一点,我试了一下,好像没什么反应!
      

  3.   

    你的分区有多大?要是很大的话你就会发现了。呵呵,至于truncate提高性能的原理你可以参考oracle的官方文档。再有你可以看直接drop和先truncate再drop分区,表空间是否有变化
      

  4.   

    哦,可能不是很大吧!第一次弄oracle!谢谢2位!