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()。カーディナリティのヒントは、配列内の要素の数を適切に推測する必要があります。このヒントがないと、オラクルがより悪い計画を選択することに気付くかもしれません(デフォルトでは、配列内で最大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 に答える