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