ITPub博客

首页 > 数据库 > Oracle > 删除大量过期分区

删除大量过期分区

原创 Oracle 作者:小亮520cl 时间:2015-04-15 15:20:48 0 删除 编辑

点击(此处)折叠或打开

  1. --以天分区时
  2. --过程
  3. create or replace
  4. PROCEDURE MONITORMSG_DROPPART(
  5.   DaysAmount NUMBER --删除间隔日期
  6. )
  7. AS
  8.  v_SqlExec VARCHAR2(2000); --DDL语句变量
  9.  --先查找DaysAmount之前的表分区
  10.  cursor cursor_part is
  11.  select partition_name from user_tab_partitions
  12.  WHERE table_name= \'MONITORMSG\' AND to_date(SUBSTR(partition_name,12),\'YYYYMMDD\')< sysdate- daysamount order by partition_name;                                     -----substr这个地方视具体情况而定
  13.  cursor_oldpart cursor_part%rowType;
  14.  begin
  15.  open cursor_part;
  16.    loop
  17.    fetch cursor_part into cursor_oldpart;
  18.    exit when cursor_part%notfound;
  19.    v_sqlexec:=\'ALTER TABLE MONITORMSG DROP PARTITION \'||cursor_oldpart.partition_name;---删除多少天前的分区
  20.    DBMS_Utility.Exec_DDL_Statement(v_SqlExec);
  21.    end loop;
  22.    close cursor_part;
  23.  END MONITORMSG_DROPPART;
  24.  
  25.  
  26. /*
  27.  
  28. declare
  29. DaysAmount NUMBER;
  30. begin
  31. MONITORMSG_DROPPART(340);
  32. end;
  33. /





  34. ----用这种游标的方法也可以实现
  35. declare
  36. v_sql varchar2(1024);
  37. cursor c1(DaysAmount in number) is select PARTITION_NAME from USER_TAB_PARTITIONS where TABLE_NAME =\'MONITORMSG\'and
  38. to_date(substr(partition_name,12),\'yyyymmdd\')
  39. v_cur c1%rowtype;
  40. begin
  41. open c1(&n); ----也就是上面的精简版
  42. loop
  43.    fetch c1 into v_cur;
  44.    exit when c1%notfound;
  45.    v_sql := \'alter table MONITORMSG drop partition \' ||v_cur.partition_name;
  46.    execute immediate v_sql;
  47.    end loop;
  48.    close c1;
  49. end;
  50.  



  51. --删除多少月前
  52. --过程
  53. create or replace
  54. PROCEDURE MONITORMSG_DROPPART(
  55.   monsAmount NUMBER --删除间隔日期
  56. )
  57. AS
  58.  v_SqlExec VARCHAR2(2000); --DDL语句变量
  59.  --先查找monsAmount之前的表分区
  60. cursor c1 is select PARTITION_NAME from USER_TAB_PARTITIONS where TABLE_NAME =\'MONITORMSG\'and
  61. months_between(trunc(sysdate,\'mm\'),trunc(to_date(substr(partition_name,12),\'yyyymmdd\'),\'mm\'))>=monsAmount order by partition_name ;
  62.  cursor_oldpart c1%rowType;
  63.  begin
  64.  open c1;
  65.    loop
  66.    fetch c1 into cursor_oldpart;
  67.    exit when c1%notfound;
  68.    v_sqlexec:=\'ALTER TABLE MONITORMSG DROP PARTITION \'||cursor_oldpart.partition_name;---删除多少月前的分区
  69.    DBMS_Utility.Exec_DDL_Statement(v_SqlExec);
  70.    end loop;
  71.    close c1;
  72.  END MONITORMSG_DROPPART;
  73.  
  74.  
  75. declare
  76. DaysAmount NUMBER;
  77. begin
  78. MONITORMSG_DROPPART(40);
  79. end;
  80. /


  81. --游标方法
  82. declare
  83. v_sql varchar2(1024);
  84. cursor c1 is select PARTITION_NAME from USER_TAB_PARTITIONS where TABLE_NAME =\'MONITORMSG\'and
  85. months_between(trunc(sysdate,\'mm\'),trunc(to_date(substr(partition_name,12),\'yyyymmdd\'),\'mm\'))>=40 order by partition_name ;
  86. v_cur c1%rowtype;
  87. begin
  88. open c1; ----也就是上面的精简版,月数也可以改成自己填,只需要稍微变更一下代码成天数那种形式即可
  89. loop
  90.    fetch c1 into v_cur;
  91.    exit when c1%notfound;
  92.    v_sql := \'alter table MONITORMSG drop partition \' ||v_cur.partition_name;
  93.    execute immediate v_sql;
  94.    end loop;
  95.    close c1;
  96. end;
  97.  
  98. */

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29096438/viewspace-1578078/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
毕业以后专业任职数据库工程师职位,itpub一直作为自己的笔记记录的地方,blog写的不详细,草书笔记,仅供参考!

注册时间:2013-09-12

  • 博文量
    529
  • 访问量
    1127020