Вложенный класс (тип объекта) в PL / SQL - PullRequest
0 голосов
/ 21 октября 2018

В Java можно определить рекурсивный (вложенный) класс, например:

private class Node
{
  Item item;
  Node next;
}

Можно ли создать подобную структуру с использованием типов объектов PL / SQL?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

можно определить рекурсивный (вложенный) класс

Да, это можно сделать, но только для достижения 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;
    /
0 голосов
/ 22 октября 2018

Что ж, вы можете обойти очевидную проблему самоссылки с заменяемыми типами, как показано ниже.

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, будут работать).

Также я не использовал это в реальном сценарии, я не знаю, есть ли предел рекурсии или каккрепкий это вообще.

0 голосов
/ 21 октября 2018

Такой опции нет,

Но согласно документации Oracle о Вложенных типах объектов , вы должны использовать Collection для хранения тех же типов (без рекурсии)

Типы коллекций - это типы данных объектов для моделирования многозначных атрибутов.Вложенные таблицы относятся к типам коллекций

Например:

describe dm_nested_categoricals
DM_NESTED_CATEGORICALS TABLE OF SYS.DM_NESTED_CATEGORICAL
...