2011-11-28 71 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记录语法:

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使用两种不同的引擎,并且只有SQL类型对SQL引擎可见。


对于Oracle的更高版本,我对SQL类型的必要性的建议不再适用。当然,在11gR2和12c中,SQL引擎将支持使用PL/SQL包中的SQL,该PL/SQL包使用TABLE()子句中的PL/SQL表。类型必须在包规范中声明,因此对于SQL引擎是公开的和可见的。在封面下Oracle为每个声明生成SQL类型。您可以发现这些类型,因为它们的名称开头为SYS_PLSQL_,后跟数字标识符。