Определите тип записи в блоке PL / SQL, который ссылается на саму коллекцию - PullRequest
0 голосов
/ 01 октября 2018

Как определить тип записи в анонимном блоке PL / SQL, который содержит свойство, являющееся коллекцией самого себя?Посмотрите на следующий пример:

DECLARE
    type t_item is record (
        name varchar2(64),
        children t_items              -- referencing t_items type
    );
    type t_items is table of t_item;  -- referencing t_item type

BEGIN
    -- script code
END

PL / SQL не имеет подъема типа, поэтому механизм Oracle создает исключение:

PLS-00498: недопустимое использование типа перед его объявлением

Как определить запись t_item, которая содержит table of t_item в своем свойстве children?

Ответы [ 2 ]

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

Пример со ссылкой на объекты:

create or replace type item; -- forward declaration 
/
create or replace type l_item_ref is table of ref item;
/
create or replace type item  is object( a number, list l_item_ref)
/
CREATE TABLE t_item OF item nested table list store as ref_items
/
declare 

  v_list l_item_ref;

begin 

insert into t_item values(1,null);
insert into t_item values(2,null);
insert into t_item values(3,null);
select ref(p) bulk collect into v_list  from t_item p;

insert into t_item values(123,v_list);
 commit;
end;

select p.a,p.list from t_item p;
0 голосов
/ 01 октября 2018

Вы можете использовать объекты, определенные в SQL Scope, используя наследование:

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TYPE abstract_item IS OBJECT (
  name VARCHAR2(64)
) NOT FINAL NOT INSTANTIABLE
/

CREATE TYPE t_items IS TABLE OF abstract_item
/

CREATE TYPE t_item UNDER abstract_item (
  children t_items
) INSTANTIABLE
/

Запрос 1 :

SELECT t_item(
         '1',
         t_items(
           t_item( '1.1', t_items() ),
           t_item(
             '1.2',
             t_items(
               t_item( '1.2.1', null )
             )
           ),
           t_item( '1.3', null )
         )
       )
FROM   DUAL

Результаты : (SQLFiddle отображает его некорректно, но работаетбез ошибок)

| T_ITEM('1',T_ITEMS(T_ITEM('1.1',T_ITEMS()),T_ITEM('1.2',T_ITEMS(T_ITEM('1.2.1',NULL))),T_ITEM('1.3',NULL))) |
|-------------------------------------------------------------------------------------------------------------|
|                                                                                  oracle.sql.STRUCT@2a094aab |

Вы можете использовать аналогичное объявление в PL / SQL:

DECLARE
  items t_item;
BEGIN
  items = t_item( 'Item Name', t_items( /* ... */ ) );
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...