带有YYYYMMDD和YYYYMMDD\u HHMMSS的Oracle删除表

带有YYYYMMDD和YYYYMMDD\u HHMMSS的Oracle删除表,oracle,Oracle,我有一些表以日期YYYYMMDD结尾,一些表以HHMMSS结尾: INVENLEVEL_20160419 INVENLEVEL_20160419_120232 <-optional to exist INVENLEVEL_20160425 INVENLEVEL_20160426 INVENLEVEL_20160426_032112 <-optional to exist 我可以删除带有日期的表格,但不能删除带有HHMMS的表格 FOR x IN ( SELECT

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

INVENLEVEL_20160419
INVENLEVEL_20160419_120232     <-optional to exist
INVENLEVEL_20160425 
INVENLEVEL_20160426
INVENLEVEL_20160426_032112     <-optional to exist
我可以删除带有日期的表格,但不能删除带有HHMMS的表格

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'; 

我怎样才能也放下手中的HHMMS呢?请注意,带有HHMMS的表是可选的,这意味着,有时我们有,有时没有。

类似的内容,可能:

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
显然,您不需要示例_数据子查询——我只是使用它来获得SQL所需的数据。您应该改为查询用户表

我修改了您的regexp,以额外检查它是否在8位数字之后到达字符串的末尾,或者在6位数字后面有另一个下划线


然后我修改了substr,检查第12位的8个字符,以获取日期-您必须这样做,因为如果您像以前那样使用字符串的结尾,则日期不一定是从结尾算起的8个字符。

类似的内容,可能:

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
显然,您不需要示例_数据子查询——我只是使用它来获得SQL所需的数据。您应该改为查询用户表

我修改了您的regexp,以额外检查它是否在8位数字之后到达字符串的末尾,或者在6位数字后面有另一个下划线

然后我修改了substr,检查第12位的8个字符,以获取日期-您必须这样做,因为如果您像以前那样使用字符串的结尾,则日期不一定是从结尾算起的8个字符