lla*_*rov 10 oracle plsql stored-procedures package user-defined-types
是否可以在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;
Run Code Online (Sandbox Code Playgroud)
我总是得到一个错误
Error: PLS-00540: object not supported in this context.
Run Code Online (Sandbox Code Playgroud)
在类型定义中.
APC*_*APC 16
不,不允许:
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>
Run Code Online (Sandbox Code Playgroud)
如果要创建仅在PL/SQL过程之间传递数据的类型,请使用PL/SQL RECORD语法:
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>
Run Code Online (Sandbox Code Playgroud)
但是,如果您想要一个可以在SQL语句中使用的类型 - 也就是说,作为TABLE()
函数的输入- 您需要将其创建为SQL类型.SQL和PL/SQL使用两个不同的引擎,SQL引擎只能看到SQL类型.
对于后续版本的Oracle,我对SQL类型的必要性的建议不再适用.当然在11gR2和12c中,SQL引擎将支持PL/SQL包中的SQL,它在TABLE()
子句中使用PL/SQL表.必须在包规范中声明类型,因此SQL引擎是公共的和可见的.在底层,Oracle为每个声明生成SQL类型.您可以发现这些类型,因为它们的名称SYS_PLSQL_
后面跟着数字标识符.