不,这是不允许的:
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> 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引擎可见。
我关于 SQL 类型必要性的建议对于更高版本的 Oracle 来说不再适用。当然,在 11gR2 和 12c 中,SQL 引擎将支持 PL/SQL 包中的 SQL,该包在 PL/SQL 包中使用 PL/SQL 表。TABLE()
条款。类型必须在包规范中声明,因此对 SQL 引擎是公开且可见的。 Oracle 在幕后为每个声明生成 SQL 类型。您可以发现这些类型,因为它们的名字开头SYS_PLSQL_
后跟数字标识符。