2014-02-13 3 views
0

У меня есть следующие функции:Oracle параметр динамического курсора

function Rpt01 (param IN varchar2) 
is 
vtype varchar2(50); 

cursor Ccur is 
select * 
from table1, table2 
where table1.date=table2.date 
and table1.id=table2.id 
and table1.cclient in (vtype); 

begin 

select (case when param='A' then 'A' 
     when param='B' then 'B' 
     else 'All' end) 
into vtype 
from dual; 

for rec in Ccur 
loop 
do sth.... 
end loop; 
end; 

Моя проблема заключается в том, что я хочу назначить несколько значение VType в остальное случае (А и В) вместо «Все». Я пробовал эти 'A' || ',' || 'B' или '' 'A' '' || ',' || '' 'B' ''. Но это не работает. Может ли кто-нибудь предложить решение?

ответ

2

Вы можете использовать SQL определенного типа коллекции, чтобы передать список значений:.

SQL> create table t 
    2 as 
    3 select 'A' x from dual union all 
    4 select 'B' x from dual union all 
    5 select 'C' x from dual union all 
    6 select 'D' x from dual 
    7/

SQL> create type tab_varchar2 is table of varchar2(10) 
    2/

SQL> create or replace procedure get_rows 
    2 (
    3 p_list in tab_varchar2 
    4 ) 
    5 is 
    6 cursor cur is 
    7 select x from t where x in (select column_value from table(p_list)); 
    8 begin 
    9 for c in cur loop 
10  dbms_output.put_line(c.x); 
11 end loop; 
12 end; 
13/

SQL> set serveroutput on 
SQL> begin 
    2 get_rows(tab_varchar2('A','C')); 
    3 end; 
    4/
A                    
C                    
+0

лучше использовать 'х член p_list' вместо в более ясно, красиво и быстро – smnbbrv

+0

Дмитрий, является таблица т и type tab_varchar2 постоянный или временный? – noors

+0

Все они постоянные. –

Смежные вопросы