2011-11-28 18 views
9

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. 

を取得します。

答えて

14

いいえ、それは許されていない:

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/SQLプロシージャの間でデータを渡しているタイプを作成する場合RECORDの構文は:あなたはSQL文で使用できるタイプが必要な場合は

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型として作成する必要があります。 SQLとPL/SQLは2つの異なるエンジンを使用し、SQLタイプのみがSQLエンジンに表示されます。


SQL Typesの必要性に関する私のアドバイスは、Oracleのそれ以降のバージョンでは当てはまりません。確かに11gR2と12cでは、SQLエンジンはTABLE()句でPL/SQLテーブルを使用するPL/SQLパッケージでSQLをサポートします。型はパッケージ仕様で宣言されなければならないため、パブリックであり、SQLエンジンで可視です。カバーの下で、Oracleは宣言ごとにSQL型を生成します。名前がSYS_PLSQL_の後に数値識別子が続くので、これらのタイプを見つけることができます。