4

私はちょうどグーグルで1時間過ごしました、そしてここでオラクルでこれをする方法についてのまっすぐな答えを得ようとしました。私が必要としているのは、次のように自動的に構築されたselectin句を使用する機能です。

select col1 from table1 where id.table IN ('1','2','3');

ここで、id値は配列内のストアドプロシージャに渡されます。連想配列は次のように定義されています。

 TYPE varchar_array_type IS TABLE OF VARCHAR2 (40)      INDEX BY BINARY_INTEGER;

それを行うための簡単で具体的な方法はありますか?ありがとう

4

1 に答える 1

5

残念ながら、コレクションタイプが(SQLではなく)PL / SQLで定義されている場合、SQLエンジンはそれを処理する方法を知らないため、SQLでそれを使用することはできません。

代わりに、SQLでコレクションタイプを定義した場合、つまり

CREATE TYPE varchar_tbl
    IS TABLE OF varchar2(40);

その後、あなたは次のようなことをすることができます

SELECT col1
  FROM table1 t1
 WHERE t1.id IN (SELECT column_value
                   FROM TABLE( <<variable of type varchar2_tbl>> ) )

Oracleのバージョン(SQLでコレクションを使用するための構文は時間の経過とともに進化してきました)に応じて、古いバージョンのOracleの構文はより複雑になりました。

PL / SQL連想配列(VARCHAR_ARRAY_TYPE)をPL / SQLのSQLネスト表コレクションに変換できますが、連想配列を繰り返し処理してネスト表を埋める必要があり、少し面倒です。VARCHAR_TBLネストされたテーブルコレクションがすでに作成されていると仮定します

SQL> CREATE OR REPLACE TYPE varchar_tbl
         IS TABLE OF varchar2(40);

連想配列からネストされたテーブルに変換し、このようなSQLステートメントでネストされたテーブルを使用できます(SCOTT.EMPテーブルを使用)

declare
  type varchar_array_type
    is table of varchar2(40)
       index by binary_integer;
  l_associative_array varchar_array_type;
  l_index             binary_integer;
  l_nested_table      varchar_tbl := new varchar_tbl();
  l_cnt               pls_integer;
begin
  l_associative_array( 1 ) := 'FORD';
  l_associative_array( 10 ) := 'JONES';
  l_associative_array( 100 ) := 'NOT A NAME';
  l_associative_array( 75 ) := 'SCOTT';
  l_index := l_associative_array.FIRST;
  while( l_index IS NOT NULL )
  loop
    l_nested_table.EXTEND;
    l_nested_table( l_nested_table.LAST ) :=
             l_associative_array( l_index );
    l_index := l_associative_array.NEXT( l_index );
  end loop;
  SELECT COUNT(*)
    INTO l_cnt
    FROM emp
   WHERE ename IN (SELECT column_value
                     FROM TABLE( l_nested_table ) );
  dbms_output.put_line( 'There are ' || l_cnt || ' employees with a matching name' );
end;

ただし、コレクションタイプ間の変換は少し面倒なので、連想配列が必要であるという特別な理由がない限り、通常はネストされたテーブルコレクションを使用する(そしてそれをストアドプロシージャに渡す)方がよいでしょう。

于 2010-12-15T23:27:53.473 に答える