1
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 ...;
4

1 回答 1

2

您只能在 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.
于 2013-01-09T15:16:31.523 回答