2017-01-09 97 views
0

我想刪除一些表,並寫了這個過程:PL/SQL REGEXP_LIKE過濾器

set serveroutput on 
    declare 
     type namearray is table of varchar2(50); 
     total integer; 
     name namearray; 
    begin 
     --select statement here ..., please see below 
     total :=name.count; 
     dbms_output_line(total); 

     for i in 1 .. total loop 
     dbms_output.put_line(name(i)); 
     -- execute immediate 'drop table ' || name(i) || ' purge'; 
    End loop; 
    end; 
    /

的想法是具有圖案像這樣的表名刪除所有表:

ERROR_REPORT[2 digit][3 Capital characters][10 digits] 
example: ERROR_REPORT16MAY2014122748 

然而,我無法提出正確的正則表達式。下面是我的選擇語句和結果:

select table_name bulk collect into name from user_tables where regexp_like(table_name, '^ERROR_REPORT[0-9{2}A-Z{3}0-9{10}]'); 

結果包括了所有我需要的表名加ERROR_REPORT311AUG20111111111。這不應該顯示在結果中。

以下select語句顯示相同的結果,這意味着A-Z {3}對正則表達式沒有影響。

select table_name bulk collect into name from user_tables where regexp_like(table_name, '^ERROR_REPORT[0-9{2}0-9{10}]'); 

我的問題是什麼將是正確的正則表達式,什麼是我的錯?

感謝,

亞歷

回答

1

正確的正則表達式是

'^ERROR_REPORT[0-9]{2}[A-Z]{3}[0-9]{10}' 
0

我想這正則表達式應該工作:

^ERROR_REPORT[0-9]{2}[A-Z]{3}[0-9]{10} 

但是,請檢查regex101鏈接。我認爲你需要ERROR_REPORT後2位,但你的例子名稱顯示3

+0

謝謝!我懂了。那麼\ d呢? \ d與[0-9]相同嗎? – user1941319

+0

請忽略\ d上的問題。 – user1941319