Как получить доступ к атрибутам объекта в результате запроса?
Есть объектный тип:
create or replace type nt1 is table of varchar2 (8)
/
create or replace type o1 as object (
id int,
dt date, names nt1)
/
В пакете определена функция, которая возвращает экземплар этого объект:
function geto1 (id int) return o1 is
begin
return o1 (id, sysdate, nt1 ('abc','def','zyx'));
end;
/
Всё компилируется, но когда пытаюсь выполнить функцию и получить возвращаемые ею значения:
select p1.geto1 (1) result from dual;
то получаю вывод как:
[P1.O1]
А как мне получить значения этого объекта, то есть, его атрибуты?
Ответы (1 шт):
Значение экземплара объекта возвращаются в виде аналогичной структуры данных на ЯП, на котором написан инструмент посылающий запросы.
Различные инструменты по разному отображают результат запроса с комплексными типами данных, например, SQL*Plus покажет тот же результат уже более информативно:
RESULT
----------------------------------------------------------------
O1(1, '2021-09-24 20:50:02', NT1('abc', 'def', 'zyx'))
Чтобы не полагаться на то, как инструмент отобразит результат, надо явно указать атрибуты объекта:
select q.fun.id, q.fun.dt, q.fun.names
from (
select p1.geto1 (1) fun from dual) q;
FUN.ID FUN.DT FUN.NAMES
---------- ------------------- --------------------------------
1 2021-09-24 21:51:21 NT1('abc', 'def', 'zyx')
Заметьте, чтобы получить доступ к атрибутам объекта, надо указывать полное квалифицированное имя, например, <alias>.<column>.<attribute>.
Осталось получить значения вложенной таблицы, обычное корреляционное соединение:
select q.fun.id, q.fun.dt, column_value name
from (
select geto1 (1) fun from dual) q, table (q.fun.names);
FUN.ID FUN.DT NAME
---------- ------------------- --------
1 2021-09-24 21:57:13 abc
1 2021-09-24 21:57:13 def
1 2021-09-24 21:57:13 zyx