为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2021-12-01 14:34:57
在 Java 中,可以定义递归(嵌套)类,例如:private class Node{  Item item;  Node next;}是否可以使用 PL/SQL 对象类型创建类似的结构?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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


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 之类的间接方法会起作用)。


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


查看完整回答
反对 回复 2021-12-01
?
呼唤远方

TA贡献1856条经验 获得超11个赞

没有这个选项,

但是根据关于嵌套对象类型的Oracle 文档,您应该使用Collection来保存相同的类型(没有递归)

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

例如:

describe dm_nested_categoricals
DM_NESTED_CATEGORICALS TABLE OF SYS.DM_NESTED_CATEGORICAL


查看完整回答
反对 回复 2021-12-01
?
守候你守候我

TA贡献1802条经验 获得超10个赞

可以定义递归(嵌套)类


是的,可以做到,但只能实现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;

    /


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信