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.
タイプ定義で。
オブジェクトタイプは、データベースレベルで宣言する必要があります。パッケージ仕様でコレクションタイプを宣言できます。
いいえ、許可されていません:
_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_
_で始まり、その後に数値識別子が続くため、見つけることができます。