Oracle用户定义的包内定义类型

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_后面跟着数字标识符.


Oll*_*lie 6

对象类型必须在数据库级别声明。您可以在包规范中声明集合类型。

可能重复: 可能在 PL/SQL 中创建 Oracle 数据库对象类型吗?