【问题标题】:Oracle User defined type inside package definition包定义中的 Oracle 用户定义类型
【发布时间】:2012-01-08 02:29:22
【问题描述】:

是否可以在 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.

在类型定义中。

【问题讨论】:

    标签: oracle stored-procedures plsql package user-defined-types


    【解决方案1】:

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

    可能重复: Possible to create Oracle Database object types inside of PL/SQL?

    【讨论】:

      【解决方案2】:

      不,这是不允许的:

      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,它在 TABLE() 子句中使用 PL/SQL 表。类型必须在包规范中声明,因此对 SQL 引擎是公开的和可见的。在幕后,Oracle 为每个声明生成 SQL 类型。您可以发现这些类型,因为它们的名称以 SYS_PLSQL_ 开头,后跟数字标识符。

      【讨论】:

        猜你喜欢
        • 2017-03-21
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        • 2023-03-09
        相关资源
        最近更新 更多