3

'連想配列変数'がグローバルに宣言さOPEN CURSOR USINGれている場合、ステートメントでそれを使用できます。

「連想配列変数」がパッケージ内で宣言されている場合、ステートメントで使用してOPEN CURSOR USINGいるときにコンパイルエラーが発生します。

詳細は以下をご覧ください

1つの連想配列変数にいくつかの値を格納しています。後で、以下のようにカーソルにそれらを取り込んで、これらの値を繰り返します。

strQuery := 'select DISTINCT column_value from table(CAST(:v_Assoc_Collection AS AssocArray_Date_t))';
OPEN RefCur_Item FOR strQuery USING v_Assoc_Collection;

ここでは、「AssocArray_Date_t」のタイプである連想配列変数「v_Assoc_Collection」を使用しました。

パッケージ[]の外でそのタイプ'AssocArray_Date_t'を宣言した場合CREATE OR REPLACE TYPE AssocArray_Date_t IS TABLE OF DATE;、それは正しく機能しています。

しかし、プロシージャ内で型を宣言すると、コンパイルエラーが発生します。

エラー:PLS-00457:式はSQLタイプである必要があります。In: "OPEN RefCur_Item FOR strQuery USING v_Assoc_Collection;"

エラー:PL / SQL:ステートメントが無視されました。In: "OPEN RefCur_Item FOR strQuery USING v_Assoc_Collection;"

参考までに、コードを以下に示します。

    -- Package Declaration
CREATE OR REPLACE PACKAGE AssocTypePackage
AS   
  Type CursorType IS REF CURSOR;      

  PROCEDURE AssocTypeProcedure(name IN VARCHAR2);
END;


-- Package Body
CREATE OR REPLACE PACKAGE BODY AssocTypePackage
AS
PROCEDURE AssocTypeProcedure(
  name IN VARCHAR2
)
IS  
  strQuery             VARCHAR2(4000);
  v_Assoc_Collection   AssocArray_Date_t := AssocArray_Date_t();
BEGIN
  FOR i IN 1..5
  LOOP      
    v_Assoc_Collection.EXTEND;
    v_Assoc_Collection(v_Assoc_Collection.COUNT) := <<someDate>>;               
  END LOOP;

  strQuery := 'select DISTINCT column_value from table(CAST(:v_Assoc_Collection AS AssocArray_Date_t))';
  OPEN RefCur_Item FOR strQuery USING v_Assoc_Collection;
  LOOP 
    -- ----
    -- some processing
    -- ----
  END LOOP; 
END  AssocTypeProcedure; 
END AssocTypePackage;
4

1 に答える 1

6

Oracleでは、SQLエンジンとPL / SQLエンジンは、相互に呼び出すことはできますが、2つの別個のものであることに注意してください。SQLステートメントで配列を使用するには、配列をSQLエンジンに表示する必要があります。つまり、CREATETYPEステートメントを使用してSQL型として宣言する必要があります。パッケージ内で作成された型は、SQLエンジンからは見えません。

于 2009-05-28T05:42:07.520 に答える