Java PL/SQL中的嵌套类(对象类型)

Java PL/SQL中的嵌套类(对象类型),java,oracle,oop,plsql,object-type,Java,Oracle,Oop,Plsql,Object Type,在Java中,可以定义递归嵌套类,如: private class Node { Item item; Node next; } 是否可以使用PL/SQL对象类型创建类似的结构?没有这样的选项 但根据Oracle docs about,您应该使用集合来保存相同的类型,而不需要递归 集合类型是用于建模多值属性的对象数据类型。嵌套表是集合类型 例如: 没有这样的选择 但根据Oracle docs about,您应该使用集合来保存相同的类型,而不需要递归 集合类型是用于建模多值属性的对象数据

在Java中,可以定义递归嵌套类,如:

private class Node
{
  Item item;
  Node next;
}

是否可以使用PL/SQL对象类型创建类似的结构?

没有这样的选项

但根据Oracle docs about,您应该使用集合来保存相同的类型,而不需要递归

集合类型是用于建模多值属性的对象数据类型。嵌套表是集合类型

例如:


没有这样的选择

但根据Oracle docs about,您应该使用集合来保存相同的类型,而不需要递归

集合类型是用于建模多值属性的对象数据类型。嵌套表是集合类型

例如:

可以定义递归嵌套类

是的,这样做是可能的,但只是为了实现继承。创建对象时,必须确保它不是最终的。请参阅下面的演示:

--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;
    /
可以定义递归嵌套类

是的,这样做是可能的,但只是为了实现继承。创建对象时,必须确保它不是最终的。请参阅下面的演示:

--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;
    /

您可以使用可替换类型绕过明显的自引用问题,如下所示

CREATE TYPE item_t
AS 
   OBJECT (
      attr_a VARCHAR2 (30));
/

CREATE TYPE base_node_t
AS
   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)可以工作


此外,我还没有在实际场景中真正使用它,我不知道是否存在递归限制,或者它通常有多健壮。

您可以使用可替换类型绕过明显的自引用问题,如下所示

CREATE TYPE item_t
AS 
   OBJECT (
      attr_a VARCHAR2 (30));
/

CREATE TYPE base_node_t
AS
   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数据库对象类型中可以做到这一点。这是一个对象类型嵌套表的示例,但这与递归定义的对象类型不同。我不相信你能在Oracle数据库对象类型中做到这一点。下面的答案是否帮助你理解了你的问题。你可以接受其中任何一个答案,如果它们为你将来的读者提供参考。下面的答案是否有助于你理解你的问题。如果答案对你有用,你可以接受其中任何一个,以供将来的读者参考。