powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в Pipelined Table Function вернуть тип AnyDataset?
8 сообщений из 8, страница 1 из 1
Как в Pipelined Table Function вернуть тип AnyDataset?
    #32406952
Bayer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно вопрос, можно ли возвращать в Pipelined Table Function данные предварительно не описывая тип возвращаемых записей. В доках вроде дается какой-то намек на возможность такой операции, но реально что-то не получается:

Oracle has three special SQL datatypes that enable you to dynamically encapsulate and access type descriptions, data instances, and sets of data instances of any other SQL type, including object and collection types. You can also use these three special types to create anonymous (that is, unnamed) types, including anonymous collection types. The types are SYS.ANYTYPE, SYS.ANYDATA, and SYS.ANYDATASET. The SYS.ANYDATA type can be useful in some situations as a return value from table functions.
...
Рейтинг: 0 / 0
Как в Pipelined Table Function вернуть тип AnyDataset?
    #32406995
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В доках вроде дается какой-то намек на возможность такой операции

Я тоже так думал, но на самом деле как результат запроса можно вернуть типы, только явно описанные в словаре, и SYS.ANYTYPE не более как для манипулирования в PL\SQL,

An ANYTYPE can contain a type description of any persistent SQL type, named or
unnamed, including object types and collection types. It can also be used to
construct new transient type descriptions.
New persistent types can only be created using the CREATE TYPE statement
. Only
new transient types can be constructed using the ANYTYPE interfaces.

т.е. скажем при помощи SYS.ANYDATA можно вернуть persistent тип, но никак не динамически сконструированный.


может в 10 что то изменилось???
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как в Pipelined Table Function вернуть тип AnyDataset?
    #39861255
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так же столкнулся с вопросом.

есть запрос
Код: plsql
1.
SELECT * FROM TABLE(mpivot('select * from V_MAT_HEAT where TAPPING_START >= sysdate - 7')) ORDER BY 1


отрабатывает отлично.
Это транспонирование набора с динамическим формированием списка полей (их количество зависит от периода в запросе, т.е. динамические)

Но,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE FUNCTION GET_MAT_HEAT(D1 DATE, D2 DATE) RETURN SYS_REFCURSOR
IS
  CUR SYS_REFCURSOR;
  DT1 DATE;
  DT2 DATE;
  SQ VARCHAR2(255);
BEGIN
  DT1 := TRUNC(NVL(D1,SYSDATE));
  DT2 := CASE WHEN TRUNC(NVL(D2,SYSDATE)) <= DT1 THEN DT1+1 ELSE D2 END;
  SQ := 'SELECT * FROM V_MAT_HEAT where TAPPING_START BETWEEN '''||DT1||''' AND '''||DT2||'''';
  OPEN CUR FOR SELECT * FROM TABLE(mpivot(SQ)) ORDER BY 1;
  RETURN CUR;  
END;


Не работает:
4 PL/SQL: ORA-22905: невозможно получить доступ к строкам элемента, не являющегося вложенной таблицей Function:GET_MAT_HEAT 11 30

Ругается на
Код: plsql
1.
SELECT * FROM TABLE(mpivot(SQ)) ORDER BY 1;



ps: делал по этому совету
...
Рейтинг: 0 / 0
Как в Pipelined Table Function вернуть тип AnyDataset?
    #39861259
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2
Код: plsql
1.
OPEN CUR FOR SELECT * FROM TABLE(mpivot(SQ)) ORDER BY 1;

В статичном PL/SQL всё должно быть статично. А тебе, возможно, поможет динамический OPEN.
Т.е. смысла в притягивании ANY за уши совершенно нет. Достаточно просто получить текст итогового запроса.
...
Рейтинг: 0 / 0
Как в Pipelined Table Function вернуть тип AnyDataset?
    #39861283
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВ статичном PL/SQL всё должно быть статично. А тебе, возможно, поможет динамический OPEN.
Т.е. смысла в притягивании ANY за уши совершенно нет. Достаточно просто получить текст итогового запроса.
Согласен, это наверно оптимально.
Тут тогда вопрос - как, имея строку SQL запроса, открыть ref_cursor по нему, точнее, вернуть датасет клиенту.
Может и тривиально, но, пока не соображу.
...
Рейтинг: 0 / 0
Как в Pipelined Table Function вернуть тип AnyDataset?
    #39861288
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Тут тогда вопрос - как, имея строку SQL запроса, открыть ref_cursor по нему, точнее, вернуть датасет клиенту.
Может и тривиально, но, пока не соображу.Серьёзно? В дебри полез, а базис не освоил?!
RTFM Native Dynamic SQL (FAQ)
...
Рейтинг: 0 / 0
Как в Pipelined Table Function вернуть тип AnyDataset?
    #39861291
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicСерьёзно? В дебри полез, а базис не освоил?!

Так точно. Видимо часть запыленных инструментов прячется в дальних шкафах.
Спасибо.
...
Рейтинг: 0 / 0
Как в Pipelined Table Function вернуть тип AnyDataset?
    #39861292
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Так точно. Видимо часть запыленных инструментов прячется в дальних шкафах.Будь проще. Не тянись за за уши притянутой модой без понимания.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в Pipelined Table Function вернуть тип AnyDataset?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]