Как создать объект имеющий атрибут с коллекцией этого же объекта?
Создаю объект node имеющий атрибут с типом данных коллекция node.
CREATE OR REPLACE TYPE node force AS OBJECT (
sValue VARCHAR2(10)
,aChild nodes)
/
CREATE OR REPLACE TYPE nodes IS TABLE OF ref node
/
declare
p node := node (aChild => nodes(), sValue => '1');
c node := node (aChild => nodes(), sValue => '2');
begin
p.aChild.Extend;
p.aChild(p.aChild.Last) := ref (c);
end;
Получаю ошибку:
ORA-06550: line 6, column 30:
PLS-00306: wrong number or types of arguments in call to 'REF'
ORA-06550: line 6, column 3:
PL/SQL: Statement ignored
Как исправить данную ошибку, или есть другие способы создать похожую структуру?
Ответы (1 шт):
Тип данных REF это условная ссылка на сущность пользовательского типа данных сохранённой в объектной таблице. В PL/SQL его нельзя использовать для создания ссылки на переменную.
Типы данных в вопросе имеют циклическую зависимость. В сообщении об ошибке в этом случае, упомянается о REF, но в PL/SQL контексте это не будет решением.
Попробуйте так:
create or replace type node force as object (value varchar2 (10)) not final
/
create or replace type nodes force is table of node
/
create or replace type pnode force under node (child nodes);
/
Воспроизводимый пример, как эти типы данных можно использовать:
var rc refcursor;
declare
r pnode := pnode (Child => nodes(), Value => '1');
n pnode := pnode (Child => nodes(), Value => '2');
begin null;
n.Child.Extend (2);
n.Child (1) := node (Value => '3');
n.Child (2) := node (Value => '4');
r.Child.Extend;
r.Child (1) := n;
open :rc for
select r.value root, p.value parent, c.value leaf
from table (r.child) p, treat (value (p) as pnode).child c;
end;
/
Даст такой результат:
ROOT PARENT LEAF
---------- ---------- ----------
1 2 3
1 2 4