2013-10-08 30 views
1

此代碼適用於列出代碼爲parm_list_a中的代碼。但是,我想實施like,如parm_list_b所示。如何將參數列表集成到LIKE子句中?

我能做些什麼來得到這個代碼使用parm_list_b

set serveroutput on; 
declare 
parm_list_a varchar2(100) := 'ADAR,CADD'; 
parm_list_b varchar2(100) := 'A%,BE%'; 

cursor c_ok_counties 
is 
with ok_counties as 
(select 'ALFA' AS cty_code, 'Alfalfa' as cty_name from dual union all 
select 'ATOK' AS cty_code, 'Atoka' as cty_name from dual union all 
select 'BEAV' AS cty_code, 'Beaver' as cty_name from dual union all 
select 'BECK' AS cty_code, 'Beckahm' as cty_name from dual union all 
select 'BLAI' AS cty_code, 'Blaine' as cty_name from dual union all 
select 'CADD' as cty_code, 'Caddo' as cty_name from dual) 
select cty_code, 
     cty_name 
from ok_counties 
where cty_code in 
     (select regexp_substr(
     parm_list_a, -- Replace with parm_list_b 
     '[^,]+',1,LEVEL) 
     from dual 
     connect by regexp_substr(
     parm_list_a -- Replace with parm_list_b 
     ,'[^,]+',1,LEVEL) is not null); 

begin 
     for county in c_ok_counties loop 
     dbms_output.put_line(county.cty_code || ' ' ||county.cty_name);   
     end loop; 
end; 

預期的效果

ALFA Alfalfa 
    ATOK Atoka 
    BEAV Beaver 
    BECK Beckham 

回答

1

正如你必須使用multiplie使用LIKEIN工作, 你可以更好的代碼如:

set serveroutput on; 
declare 
parm_list_a varchar2(100) := 'ADAR,CADD'; 
parm_list_b varchar2(100) := 'A|BE'; 

cursor c_ok_counties 
is 
with ok_counties as 
(select 'ALFA' AS cty_code, 'Alfalfa' as cty_name from dual union all 
select 'ATOK' AS cty_code, 'Atoka' as cty_name from dual union all 
select 'BEAV' AS cty_code, 'Beaver' as cty_name from dual union all 
select 'BECK' AS cty_code, 'Beckahm' as cty_name from dual union all 
select 'BLAI' AS cty_code, 'Blaine' as cty_name from dual union all 
select 'CADD' as cty_code, 'Caddo' as cty_name from dual) 
select cty_code, 
     cty_name 
FROM OK_COUNTIES 
where regexp_like(cty_code, '^('||parm_list_b||')'); 

begin 
     for county in c_ok_counties loop 
     dbms_output.put_line(county.cty_code || ' ' ||county.cty_name);   
     END LOOP; 
end;