带有YYYMMDD和YYYMMDD_HHMMSS的Oracle Drop Table

时间:2016-04-26 07:55:07

标签: oracle

我有一些表以日期结束(YYYYMMDD),有些以HHMMSS结尾:

INVENLEVEL_20160419
INVENLEVEL_20160419_120232     <-optional to exist
INVENLEVEL_20160425 
INVENLEVEL_20160426
INVENLEVEL_20160426_032112     <-optional to exist

我需要在7天内保留桌子并放弃其他INVENLEVEL表格。

预期结果,删除了以下2个表:

INVENLEVEL_20160419
INVENLEVEL_20160419_120232

我可以删除包含日期的表格,但不能删除带有HHMMSS的表格。

FOR x IN ( SELECT TABLE_NAME
                    FROM USER_TABLES
                    WHERE REGEXP_LIKE(TABLE_NAME, 'INVENLEVEL_[[:digit:]]{8}')
                    AND TO_DATE(SUBSTR(TABLE_NAME, -8), 'yyyymmdd') <= TRUNC(SYSDATE) - 7
                   ) LOOP

    EXECUTE IMMEDIATE 'DROP TABLE ' ||
    x.TABLE_NAME ||
    ' PURGE'; 

我怎样才能使用HHMMSS下桌呢?请注意,具有HHMMSS的表是可选的存在,意味着,有时我们拥有它,有时不存在。

1 个答案:

答案 0 :(得分:2)

这样的事情,也许是:

with sample_data as (select 'INVENLEVEL_20160419' table_name from dual union all
                     select 'INVENLEVEL_20160419_120232' table_name from dual union all
                     select 'INVENLEVEL_20160425' table_name from dual union all
                     select 'INVENLEVEL_20160426' table_name from dual union all
                     select 'INVENLEVEL_20160426_032112' table_name from dual union all
                     select 'NEW_20160426_032112' table_name from dual union all
                     select 'FRED' table_name from dual)
---- end of mimicking your data; see SQL below
select table_name,
       to_date(substr(table_name, 12, 8), 'yyyymmdd') dt
from   sample_data
where  REGEXP_LIKE(TABLE_NAME, '^INVENLEVEL_[[:digit:]]{8}($|_[[:digit:]]{6})')
and    to_date(substr(table_name, 12, 8), 'yyyymmdd') <= trunc(sysdate -7);

TABLE_NAME                 DT       
-------------------------- ----------
INVENLEVEL_20160419        19/04/2016
INVENLEVEL_20160419_120232 19/04/2016

显然,您不需要sample_data子查询 - 我只是使用它来使SQL的数据起作用。你会查询你的user_tables。

我修改了你的正则表达式,另外检查它是否在8位数之后到达了字符串的末尾,或者有另一个下划线后跟6位数。

然后我修改你的substr来检查第12个位置的8个字符,以便得到日期 - 你必须这样做,因为如果你像你一直在使用字符串的结尾,日期不一定是8个字符。