2016-04-26 86 views
0

我有一些表與日期(年月日)結束,一些終端用HHMMSS:甲骨文刪除表與YYYMMDD和YYYMMDD_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的表格是可選的,意味着,有時我們有,有時不。

回答

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個字符。

+0

作品很有魅力,感謝:D – hades