Oracle用户定义对象-自引用类型的集合

Oracle用户定义对象-自引用类型的集合,oracle,collections,adt,user-defined-types,self-reference,Oracle,Collections,Adt,User Defined Types,Self Reference,可能重复: 我有一个场景,在这个场景中,我必须创建一个用户定义的类型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 sku

可能重复:

我有一个场景,在这个场景中,我必须创建一个用户定义的类型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\u t和skulink\u t处于不完整状态,编译器会投诉以完成它们。我不知道该怎么办。任何帮助都将不胜感激。

您需要使用嵌套的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%的时间里,常规的层次结构表可能工作得更好。

为什么您认为需要创建一个包含该类型集合的类型?这似乎不是一个合理的要求,我很难想象有哪种语言可以做到这一点。如果您可以消除该需求,那么您可以明智地定义一个对象A,并定义另一个对象B,该对象B具有一组A,这似乎是解决此类问题的适当方法。你能解释一下为什么不能有多个对象吗?基本上我想从我的表中创建一个树结构。根据要求,这是定义和描述为:目录-->类别-->类别-->类别-->产品-->sku-->绑定的层次结构。对于上述不完整的回复,我很抱歉,下面是我想要写的内容。基本上,我正试图从我拥有的表中创建一个树结构,并使用DBMS_XMLGEN包或任何其他工具。根据需求,这是层次结构的定义方式:目录-->类别-->类别-->类别-->产品-->sku-->sku。目录可以有一个或多个类别,这些类别还可以有一个或多个子类别等,类似地,树分支向下延伸到产品和SKU。这一要求无法更改。如果表中已有数据,并且目标是生成XML,那么为什么要首先尝试创建对象类型层次结构?为什么不直接从表生成XML呢?