从DBMS_UTILITY.LNAME_ARRAY中选择数据

时间:2013-01-09 14:57:43

标签: sql oracle plsql

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

1 个答案:

答案 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.