只能在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.