2017-01-09 94 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