web-dev-qa-db-ja.com

パッケージ定義内のOracleユーザー定義タイプ

oracleパッケージ定義内にユーザー定義タイプを含めることは可能ですか?フォローしてみると

CREATE OR REPLACE PACKAGE AF_CONTRACT AS  -- spec
   -- PROCEDURE my_rpcedure (emp_id NUMBER);
   TYPE DTO_GRID AS OBJECT
   (
     ROWKEY    NVARCHAR2(200),
     COLUMNKEY NVARCHAR2(200),
     CELLVALUE NVARCHAR2(200),
     OLDVALUE  NVARCHAR2(200),
     TAG       NVARCHAR2(200)
   );
END AF_CONTRACT;
/
CREATE OR REPLACE PACKAGE BODY AF_CONTRACT AS  -- body

--   PROCEDURE my_procedure (emp_id NUMBER) IS
--   BEGIN
--      
--   END my_procedure;

END AF_CONTRACT;

いつもエラーが発生します

Error: PLS-00540: object not supported in this context.

タイプ定義で。

10
llasarov

オブジェクトタイプは、データベースレベルで宣言する必要があります。パッケージ仕様でコレクションタイプを宣言できます。

重複の可能性: PL/SQL内にOracleデータベースオブジェクトタイプを作成できますか?

3
Ollie

いいえ、許可されていません:

_SQL> CREATE OR REPLACE PACKAGE AF_CONTRACT AS  -- spec
   -- PROCEDURE my_rpcedure (emp_id NUMBER);
   TYPE DTO_GRID AS OBJECT
   (
     ROWKEY    NVARCHAR2(200),
     COLUMNKEY NVARCHAR2(200),
     CELLVALUE NVARCHAR2(200),
     OLDVALUE  NVARCHAR2(200),
     TAG       NVARCHAR2(200)
   );
END AF_CONTRACT;
/
  2    3    4    5    6    7    8    9   10   11   12

Warning: Package created with compilation errors.

SQL> SQL> sho err
Errors for PACKAGE AF_CONTRACT:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/4      PLS-00540: object not supported in this context.
SQL>
_

PL/SQLプロシージャ間でデータを渡すだけのタイプを作成する場合は、PL/SQLRECORD構文を使用します。

_SQL> CREATE OR REPLACE PACKAGE AF_CONTRACT AS  -- spec
   -- PROCEDURE my_rpcedure (emp_id NUMBER);
   TYPE DTO_GRID IS RECORD
   (
     ROWKEY    NVARCHAR2(200),
     COLUMNKEY NVARCHAR2(200),
     CELLVALUE NVARCHAR2(200),
     OLDVALUE  NVARCHAR2(200),
     TAG       NVARCHAR2(200)
   );
END AF_CONTRACT;
/
  2    3    4    5    6    7    8    9   10   11   12
Package created.

SQL>
_

ただし、SQLステートメントで使用できるタイプ(つまり、TABLE()関数への入力として)が必要な場合は、SQLタイプとして作成する必要があります。 SQLとPL/SQLは2つの異なるエンジンを使用し、SQLタイプのみがSQLエンジンに表示されます。


SQLタイプの必要性に関する私のアドバイスは、それ以降のバージョンのOracleには当てはまりません。確かに、11gR2および12cでは、SQLエンジンはTABLE()句でPL/SQLテーブルを使用するPL/SQLパッケージのSQLをサポートします。タイプはパッケージ仕様で宣言する必要があるため、SQLエンジンに公開されて表示されます。オラクルは、内部で宣言ごとにSQLタイプを生成します。これらのタイプは、名前が_SYS_PLSQL__で始まり、その後に数値識別子が続くため、見つけることができます。

15
APC