2013-01-09 48 views
0
DECLARE 
ltab_vals DBMS_UTILITY.LNAME_ARRAY; 
    v_tablen BINARY_INTEGER; 
BEGIN 

DBMS_UTILITY.COMMA_TO_TABLE(list => 'AA,B,CC,DEF' 
           ,tablen => v_tablen 
           ,tab => ltab_vals); 

END; 
/

如何在select语句中使用ltab_vals变量? 我需要写是这样的:从DBMS_UTILITY.LNAME_ARRAY中选择数据

SELECT val INTO variable_ FROM v_tablen WHERE ...; 

回答

1

只能在SQL语句中使用SQL类型。所以你必须将这个PL/SQL数组转换成一个SQL数组。

例如,如果我们创建了your_array类型。

SQL> create table your_table(col varchar2(3)); 

Table created. 

SQL> insert into your_table values ('AA'); 

1 row created. 

SQL> insert into your_table values ('DEF'); 

1 row created. 

SQL> create type your_array as table of varchar2(4000); 
    2/

Type created. 

SQL> DECLARE 
    2 ltab_vals DBMS_UTILITY.LNAME_ARRAY; 
    3 v_tablen BINARY_INTEGER; 
    4  v_t your_array := your_array(); 
    5 BEGIN 
    6 
    7 DBMS_UTILITY.COMMA_TO_TABLE(list => 'AA,B,CC,DEF' 
    8        ,tablen => v_tablen 
    9        ,tab => ltab_vals); 

副本的阵列切换到一个SQL之一:

10 for idx in 1..ltab_vals.count 
11 loop 
12  v_t.extend; 
13  v_t(v_t.last) := ltab_vals(idx); 
14 end loop; 
15 

现在使用table()函数形成所述选择。基数提示应该是数组中元素数量的合理猜测。如果没有这个提示,你可能会发现oracle会选择一个更糟糕的计划(默认情况下,它会假设数组中有〜8k行)。

17 for r_row in (select /*+ cardinality(p, 10) */ t.* 
18     from your_table t 
19       inner join table(v_t) p 
20         on t.col = p.column_value) 
21 loop 
22  dbms_output.put_line(r_row.col); 
23 end loop; 
24 
25 END; 
26/
AA 
DEF 

PL/SQL procedure successfully completed.