web-dev-qa-db-ja.com

Oracle SQLのIN演算子内で配列変数を使用するにはどうすればよいですか?

タイプTYPE arr_type is TABLE of VARCHAR2(11 BYTE);を宣言してから、それを初期化します:MY_array arr_type := arr_type();

そこにいくつかのvarcharを挿入してから、IN演算子で使用しようとしています。

_set serveroutput on;
DECLARE
  TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
  my_array arr_type := arr_type();
  my_array_two arr_type := arr_type();
BEGIN 

  SELECT MY_ID BULK COLLECT INTO my_array FROM XYZ_REQUEST;
  SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST WHERE PARENT_ID IN my_array;

   FOR i IN 1..cm_array.COUNT LOOP
     DBMS_OUTPUT.PUT_LINE(my_array(i));
   END LOOP; 
END; 
/
_

_local collection types not allowed in SQL statements_を含む行に_SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST WHERE PARENT_ID IN my_array;_というエラーが表示されますが、その行をコメントアウトすると_my_array_が正常に出力されるため、意味がありません。つまり、TYPE arr_type is TABLE of VARCHAR2(11 BYTE);

この問題は、IN演算子を使用して無制限の配列を使用しようとしているためと考えられます。つまり、_PARENT_ID IN my_array_です。

変数を括弧で囲んでみましたが、役に立ちません。配列でIN演算子を使用するにはどうすればよいですか?

この場合、サブクエリまたは結合を使用できることを理解していますが、IN演算子を使用して配列を使用できるかどうか疑問に思っています。

4
Abdul
_WHERE PARENT_ID IN my_array;
_

これは機能しません。まず、エラーメッセージに示されているように、SQLステートメントでローカルコレクションタイプを使用することはできません。データベースで定義する必要があります。次に、その構文は存在しません。

したがって、最初にタイプを定義します。

_CREATE TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
_

その後、次のようにTABLE()関数でコレクションを使用できます。

_set serveroutput on;
DECLARE
  my_array arr_type := arr_type();
  my_array_two arr_type := arr_type();
BEGIN 

  SELECT MY_ID BULK COLLECT INTO my_array FROM XYZ_REQUEST;
  SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST
  WHERE PARENT_ID IN (select * from table(my_array)); -- <==========================

   FOR i IN 1..cm_array.COUNT LOOP
     DBMS_OUTPUT.PUT_LINE(my_array(i));
   END LOOP; 
END; 
/
_
7
Balazs Papp