代码之家  ›  专栏  ›  技术社区  ›  Oiale

pl/sql中的嵌套类(对象类型)

  •  1
  • Oiale  · 技术社区  · 6 年前

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

    private class Node
    {
      Item item;
      Node next;
    }
    

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

    3 回复  |  直到 6 年前
        1
  •  1
  •   Ori Marko    6 年前

    没有这样的选择

    但是根据甲骨文的文件 Nested Object Types 你应该使用 Collection 保存相同类型(带Put递归)

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

    例子:

    describe dm_nested_categoricals
    DM_NESTED_CATEGORICALS TABLE OF SYS.DM_NESTED_CATEGORICAL
    
        2
  •  2
  •   Padders    6 年前

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

    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>
    

    但是,我不认为这样的类型可以声明为列数据类型,因此直接将它们保存在关系表中(尽管诸如在任何数据中或转换为XML之类的间接方法可以工作)。

    另外,我还没有在真实的场景中使用它,我不知道是否存在递归限制,也不知道这通常有多强大。

        3
  •  1
  •   XING    6 年前

    可以定义递归(嵌套)类

    是的,这是有可能做到的,但只能做到 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;
        /