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变量? 我需要写这样的东西:
SELECT val INTO variable_ FROM v_tablen WHERE ...;
答案 0 :(得分: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 1:
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.