在包定义中使用的Oracle用户自定义类型

16

在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.

在类型定义中。

2个回答

21

不可以,这是被禁止的:

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 包中,在包规范中必须声明这些类型,因此它们是公共的并且对 SQL 引擎可见。在幕后,Oracle 生成每个声明的 SQL 类型。您可以通过这些类型的名称以SYS_PLSQL_开头,后跟数字标识符来识别它们。


6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接