【问题标题】:Is it possible to create Oracle associative array type outside of a package/procedure?是否可以在包/过程之外创建 Oracle 关联数组类型?
【发布时间】:2009-06-30 22:49:39
【问题描述】:

在 Oracle 数据库 10g 中,是否可以在包或过程之外创建关联数组类型?我希望能够做到这一点,以便我可以在另一种类型中引用这个关联数组类型。例如:

create type my_type_map is table of varchar2(10) index by varchar2(10);

create type my_other_type as object (   
    id number(15),
    member procedure initialize(p_my_type_map my_type_map)
) not instantiable not final;

我得到的错误是:

SQL> create type my_type_map is table of varchar2(20) index by varchar2(10);
  2  /

Warning: Type created with compilation errors.

SQL> show errors;
Errors for TYPE MY_TYPE_MAP:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      PL/SQL: Compilation unit analysis terminated
1/21     PLS-00355: use of pl/sql table not allowed in this context
SQL> 

似乎甲骨文认为:

index by varchar2(10)    

是 PL/SQL 并且不允许在创建 SQL 类型时使用它。如果 Oracle 确实不允许在包之外定义关联数组,那么有没有好的选择?是否可以在包内创建扩展 Oracle 对象的类型,以便在同一个包中定义所有类型?

谢谢, 杰夫

编辑:更正了代码示例,添加了日志,添加了可能的替代问题。

【问题讨论】:

  • 什么时候出现错误?我刚刚创建了上述两种类型,没有受到 oracle 10gR2 的投诉。您的示例说 INDEX BY VARCHAR2,而不是 pls_integer...
  • 添加了更多细节和更正。谢谢!

标签: oracle plsql


【解决方案1】:

答案是否定的,你不能做你想做的事,就像你不能创建一个类型来向一个对象添加一个 BOOLEAN 类型的变量一样。对象中的项必须包含 Oracle 类型,而不是 PL/SQL 类型。有点笨拙的替代方案可能是:

CREATE TYPE t_aa AS VARRAY(10) OF VARCHAR2(10);

CREATE OR REPLACE TYPE t_ua AS OBJECT (ID NUMBER(15)
                                     , MEMBER PROCEDURE initialize(p_aa t_aa)
                                     , MEMBER PROCEDURE initialize(p_aa_i t_aa))
                               NOT INSTANTIABLE NOT FINAL;

将关联的变量对存储在两个 VARRAY 中。您必须知道数组的最大可能大小。

【讨论】:

  • 感谢 DCookie。我决定不使用 Oracle 对象类型,而是直接使用 PL/SQL 和记录类型。
  • 我不是 Oracle 对象的忠实拥护者 - 我没有看到巨大的好处,而且它们绝对不标准,使您的数据结构不可移植。
【解决方案2】:

如错误所示,这些是 PL/SQL 类型。没有什么能阻止你在包的公共规范中声明它们,然后你可以在任何你需要的 PL/SQL 代码中引用它们。

【讨论】:

  • 看起来不像包允许对象类型定义:创建或替换包 my_package 因为类型 my_type_map 是 varchar2(10) 索引的 varchar2(10) 表;键入 my_other_type 作为对象(id 编号(15),成员过程初始化(p_my_type_map 编号))不可实例化不是最终的;结尾;错误(2,1):PLS-00707:不支持的构造或内部错误 [2603] 错误(5,3):PLS-00540:此上下文中不支持对象。错误(5,3):PL/SQL:声明被忽略我是不是走错了路?
  • 我认为他的意思是你应该声明对象和 pl/sql 类型彼此分开
  • 不幸的是,在 PL/SQL 之外定义的对象类型不能引用 PL/SQL 中的任何内容。
  • 我认为您的意思是“在 PL/SQL 包之外定义的对象类型”——它不能引用 PL/SQL 中的任何内容是什么意思? “对象类型和子类型在PL/SQL过程和函数中大部分可以出现内置类型的地方都可以使用。PL/SQL函数和过程的参数和变量可以是对象类型。你可以实现与PL/SQL 中的对象类型。这些方法(函数和过程)作为用户模式的一部分驻留在服务器上。 download.oracle.com/docs/cd/B19306_01/appdev.102/b14260/…
  • 是的,这就是我的意思。感谢您的澄清。据我所知,我被卡住了,因为我无法在包外定义关联数组类型,也无法在包内定义依赖对象类型。所以我决定完全放弃对象类型方法,使用 Oracle 记录类型。
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 2020-03-31
  • 2018-09-06
  • 2019-07-27
  • 2012-11-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多