-
炎炎设计
好吧,您可以使用可替换类型来规避明显的自我引用问题,如下所示。CREATE TYPE item_tAS OBJECT ( attr_a VARCHAR2 (30));/CREATE TYPE base_node_tAS OBJECT ( item item_t) NOT FINAL NOT INSTANTIABLE;/CREATE TYPE node_t UNDER base_node_t ( next_node base_node_t);/DECLARE nodes node_t := node_t ( item_t ( 'grandparent'), node_t ( item_t ( 'parent'), node_t ( item_t ( 'child'), NULL)));BEGIN DBMS_OUTPUT.put_line ( XMLTYPE (nodes).getclobval (0, 2));END;/<NODE_T> <ITEM> <ATTR_A>grandparent</ATTR_A> </ITEM> <NEXT_NODE> <ITEM> <ATTR_A>parent</ATTR_A> </ITEM> <NEXT_NODE> <ITEM> <ATTR_A>child</ATTR_A> </ITEM> <NEXT_NODE/> </NEXT_NODE> </NEXT_NODE></NODE_T>但是,我不相信此类类型可以声明为列数据类型,因此不能将它们直接保存在关系表中(尽管诸如在 anydata 内部或转换为 xml 之类的间接方法会起作用)。此外,我还没有在实际场景中真正使用过它,我不知道是否有递归限制或这通常有多健壮。
-
呼唤远方
没有这个选项,但是根据关于嵌套对象类型的Oracle 文档,您应该使用Collection来保存相同的类型(没有递归)集合类型是用于建模多值属性的对象数据类型。嵌套表是集合类型例如:describe dm_nested_categoricals
DM_NESTED_CATEGORICALS TABLE OF SYS.DM_NESTED_CATEGORICAL
-
守候你守候我
可以定义递归(嵌套)类是的,可以做到,但只能实现inheritance. 在创建对象时,您必须确保它不是Final。见下面的演示:--Created an Object which is not `Final` CREATE OR REPLACE TYPE prnt_obj AS OBJECT ( id NUMBER, name VARCHAR2(10) ) NOT INSTANTIABLE NOT FINAL; --<-- This make sure that the object can be nested. / --Created a type where the above table columns can be nested. CREATE OR REPLACE TYPE chld_obj UNDER prnt_obj ( chld_id NUMBER, chld_name VARCHAR2(10) ); / --Created a table of Object. CREATE TABLE TAB of chld_obj; / --Inserted record to the table INSERT INTO tab VALUES ( 1, 'XXX', 2, 'YYY' ); --selected records SELECT * FROM tab; /