Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в Pipelined Table Function вернуть тип AnyDataset? / 8 сообщений из 8, страница 1 из 1
12.02.2004, 12:46
    #32406952
Bayer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Pipelined Table Function вернуть тип AnyDataset?
Собственно вопрос, можно ли возвращать в 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
12.02.2004, 13:02
    #32406995
DimaR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Pipelined Table Function вернуть тип AnyDataset?
В доках вроде дается какой-то намек на возможность такой операции

Я тоже так думал, но на самом деле как результат запроса можно вернуть типы, только явно описанные в словаре, и 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
Период между сообщениями больше года.
13.09.2019, 07:57
    #39861255
stells2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Pipelined Table Function вернуть тип AnyDataset?
Так же столкнулся с вопросом.

есть запрос
Код: 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
13.09.2019, 08:08
    #39861259
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Pipelined Table Function вернуть тип AnyDataset?
stells2
Код: plsql
1.
OPEN CUR FOR SELECT * FROM TABLE(mpivot(SQ)) ORDER BY 1;

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

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


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