【问题标题】:Oracle User Defined Objects - collection of self referencing type [duplicate]Oracle 用户定义对象 - 自引用类型的集合 [重复]
【发布时间】:2012-10-23 18:07:33
【问题描述】:

可能重复:
How can I define a type in oracle11g that references a collection of that type?

我有一个场景,我必须创建一个用户定义的类型 A,它有一个类型 A 的集合。 我尝试执行以下操作但没有帮助:

create or replace type sku_t;

create or replace type skulink_t as table of sku_t;

create or replace type sku_t as object(skuId varchar(12), display_name varchar(100), bundlnks ref skulink_t ); 

这会使对象 sku_t 和 skulink_t 处于不完整状态,编译器会抱怨要完成它们。我不知道该怎么做。任何帮助将不胜感激。

【问题讨论】:

  • 为什么您认为您需要创建一个包含该类型集合的类型?这似乎不是一个明智的要求,我很难想象有任何语言可以实现这样的事情。如果您可以消除该要求,那么您可以明智地定义一个对象 A 并定义另一个具有 A 集合的对象 B,这似乎是解决此类问题的适当方法。你能解释一下为什么不能有多个对象吗?
  • 基本上我想从我拥有的表中创建一个树结构。根据要求,这是定义和描述为的层次结构:catalog-->category-->category-->category-->product-->sku-->bundl
  • 抱歉上面的回复不完整,下面是我想写的。
  • 基本上我正在尝试从我拥有的表中创建一个树结构,并同时使用 DBMS_XMLGEN 包或任何其他工具将其转换为 XML 格式。根据要求,这是定义层次结构的方式:catalog-->category(s)-->category(s)-->category(s)-->product(s)-->sku(s)-- >sku。目录可以有一个或多个类别,还可以有一个或多个子类别等,类似地,树分支到产品和 sku。此要求无法更改。
  • 如果您已经拥有表中的数据并且目标是生成 XML,那么您为什么要首先尝试创建对象类型层次结构?为什么不直接从表中生成 XML?

标签: oracle collections adt user-defined-types self-reference


【解决方案1】:

您需要使用 REF 的嵌套表,而不是嵌套表的 REF。

create or replace type sku_t;
create or replace type skulink_t as table of ref sku_t;
create or replace type sku_t as object(skuId varchar(12), display_name varchar(100), bundlnks skulink_t ); 

使用示例:

create table sku_table of sku_t nested table bundlnks store as outer_nt;

insert into sku_table values(sku_t('sku1', 'sku1', null));
insert into sku_table values(sku_t('sku2', 'sku2', null));
insert into sku_table
values(sku_t('sku3', 'sku3',
    skulink_t
    (
        (select ref(s) from sku_table s where s.skuId = 'sku1'),
        (select ref(s) from sku_table s where s.skuId = 'sku2')
    )));

commit;

select deref(b.column_value).skuid skuid
from sku_table, table(bundlnks) b where skuid = 'sku3';

skuid
-----
sku1
sku2

但常规的分层表在 99.99% 的情况下可能会工作得更好。

【讨论】:

    猜你喜欢
    • 2018-09-19
    • 2021-10-02
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多