带有YYYYMMDD和YYYYMMDD\u HHMMSS的Oracle删除表
我有一些表以日期YYYYMMDD结尾,一些表以HHMMSS结尾:带有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
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个字符