表命名规则如下:T_TIG_DFL  00  J    001    Y  2009  M   10
                              不变    从0至50     年份     月份T_TIG_DFL00J000Y2009M01
T_TIG_DFL00J000Y2009M02
T_TIG_DFL00J000Y2009M03
T_TIG_DFL00J000Y2009M04
T_TIG_DFL00J000Y2009M05
T_TIG_DFL00J000Y2009M06
T_TIG_DFL00J000Y2009M07
T_TIG_DFL00J000Y2009M08
T_TIG_DFL00J000Y2009M09
T_TIG_DFL00J000Y2009M10
T_TIG_DFL00J000Y2009M11
T_TIG_DFL00J000Y2009M12T_TIG_DFL00J001Y2009M01
T_TIG_DFL00J001Y2009M02
T_TIG_DFL00J001Y2009M03
T_TIG_DFL00J001Y2009M04
T_TIG_DFL00J001Y2009M05
T_TIG_DFL00J001Y2009M06
T_TIG_DFL00J001Y2009M07
T_TIG_DFL00J001Y2009M08
T_TIG_DFL00J001Y2009M09
T_TIG_DFL00J001Y2009M10
T_TIG_DFL00J001Y2009M11
T_TIG_DFL00J001Y2009M12T_TIG_DFL00J002Y2009M01
T_TIG_DFL00J002Y2009M02
T_TIG_DFL00J002Y2009M03
T_TIG_DFL00J002Y2009M04
T_TIG_DFL00J002Y2009M05
T_TIG_DFL00J002Y2009M06
T_TIG_DFL00J002Y2009M07
T_TIG_DFL00J002Y2009M08
T_TIG_DFL00J002Y2009M09
T_TIG_DFL00J002Y2009M10
T_TIG_DFL00J002Y2009M11
T_TIG_DFL00J002Y2009M12
......
T_TIG_DFL00J050Y2009M01
T_TIG_DFL00J050Y2009M02
T_TIG_DFL00J050Y2009M03
T_TIG_DFL00J050Y2009M04
T_TIG_DFL00J050Y2009M05
T_TIG_DFL00J050Y2009M06
T_TIG_DFL00J050Y2009M07
T_TIG_DFL00J050Y2009M08
T_TIG_DFL00J050Y2009M09
T_TIG_DFL00J050Y2009M10
T_TIG_DFL00J050Y2009M11
T_TIG_DFL00J050Y2009M12T_TIG_DFL00J000Y2010M01
T_TIG_DFL00J000Y2010M02
T_TIG_DFL00J000Y2010M03
T_TIG_DFL00J000Y2010M04
T_TIG_DFL00J000Y2010M05
T_TIG_DFL00J000Y2010M06
T_TIG_DFL00J000Y2010M07
T_TIG_DFL00J000Y2010M08
T_TIG_DFL00J000Y2010M09
T_TIG_DFL00J000Y2010M10
T_TIG_DFL00J000Y2010M11
T_TIG_DFL00J000Y2010M12T_TIG_DFL00J001Y2010M01
T_TIG_DFL00J001Y2010M02
T_TIG_DFL00J001Y2010M03
T_TIG_DFL00J001Y2010M04
T_TIG_DFL00J001Y2010M05
T_TIG_DFL00J001Y2010M06
T_TIG_DFL00J001Y2010M07
T_TIG_DFL00J001Y2010M08
T_TIG_DFL00J001Y2010M09
T_TIG_DFL00J001Y2010M10
T_TIG_DFL00J001Y2010M11
T_TIG_DFL00J001Y2010M12
......
T_TIG_DFL00J050Y2010M01
T_TIG_DFL00J050Y2010M02
T_TIG_DFL00J050Y2010M03
T_TIG_DFL00J050Y2010M04
T_TIG_DFL00J050Y2010M05
T_TIG_DFL00J050Y2010M06
T_TIG_DFL00J050Y2010M07
T_TIG_DFL00J050Y2010M08
T_TIG_DFL00J050Y2010M09
T_TIG_DFL00J050Y2010M10
T_TIG_DFL00J050Y2010M11
T_TIG_DFL00J050Y2010M12
数据库自动一个月创建一个表,现在有好几年的表,我只想保留一年的数据。
如何写个JOB定时删除不想保留的表,望给予指点。谢谢!

解决方案 »

  1.   

     declare   
    2    jobno number;   
    3 begin   
    4    dbms_job.submit(
    5      jobno,
    6     'p_dosomething;',  --what
    7      to_date('20090101020000','yyyy-mm-dd hh24:mi:ss'),--next_date,可以不填
    8     'Interval时间字符串'--interval,关键设置
    9    );   
    10    commit;   
    11 end; 
      

  2.   

    取得当前日期,然后删除where 日期 < 当前日期 -1 的表或者每月job自动创建表的时候,根据当前月份,向前取11个月,小于11个月以前的日期的所有表删除日期加减函数可以参照这个
    --增加12个月,也就是1年
    select sysdate,add_months(sysdate,12) from dual
      

  3.   

    表中的日期怎么判断呢?能否先把所有需要删除的表查找出来,然后统一DROP呢?
      

  4.   

    定时执行以下存储过程,保留近一年的表create or replace procedure droptable_sp as 
    begin
     for c in (select table_name from user_tables where table_name like 'T\_TIG\_DFL00J___Y____M__') loop
      if (trunc(sysdate,'mm')-to_date(substr(c.table_name,17,4)||
        substr(c.table_name,23,2),'yyyymm')) year to month > interval '12' month then
       execute immediate 'drop table '||c.table_name;
      end if;
     end loop;
    end;
    /
      

  5.   


    举例:
    INTERVAL '5-3' YEAR TO MONTH
    5年3个月怎么算出来的
      

  6.   

    我代入数值运行了一下,数据库中的表没有被删除,看下句:  select (trunc(sysdate, 'mm') -
             to_date(substr('t_tig_dfl00j001y2009m11', 17, 4) ||
                      substr('t_tig_dfl00j001y2009m11', 22, 2),
                      'yyyymm')) year to month
              from dual;
    这个的结果是:+01-04+01-04是怎么与'12'进行比较的?+01-04应该是1年4个月,也就是16个月吧,是不是要把+01-04转成1后再与12进行比较?怎么转? 谢谢指点
      

  7.   

    不用手动去转,oracle 会自动处理的。SQL> select * from dual where interval '1-6' year to month > interval '12' month;D
    -
    XSQL> select * from dual where interval '1-6' year to month < interval '12' month;no rows selectedSQL>
      

  8.   


    create or replace procedure droptable_sp as
    begin
     for c in (select table_name from user_tables where table_name like 'T_TIG_DFL00J%') loop
      if (trunc(sysdate,'mm')-to_date(substr(c.table_name,17,4)||
        substr(c.table_name,22,2),'yyyymm')) year to month > interval '12' month then
       execute immediate 'drop table '||c.table_name;
      end if;
     end loop;
    end;
    改成这样可以了,但有时候月份为00或者年份为2099错误的时候报错。加个异常就好了