powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как вернуть recordset в процедуре?
11 сообщений из 11, страница 1 из 1
Как вернуть recordset в процедуре?
    #40045654
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть периодически запускаемый скрипт, который при запуске получает некоторый набор данных (select), а затем проходит в цикле по полученному набору, извлекает из него определенный идентификатор и вызывает процедуру, передавая в нее полученный идентификатор.
По некоторым причинам мне бы хотелось получать исходный набор данных не select-запросом, а также вызывая процедуру (exec), которая бы вернула набор данных.
Подобная процедура выглядит примерно так:
Код: plsql
1.
2.
3.
4.
5.
BEGIN
...
OPEN :RECORDSET FOR
SELECT ... FROM ... ;
END;


И после ее выполнения я получаю нужные данные из параметра :RECORDSET.

В PHP клиентская библиотека (OCI8) частично поддерживает тип данных CURSOR, поэтому в скриптах на PHP такой способ работает.
Но у меня также есть скрипты на Perl, а там клиентская библиотека курсоры вроде бы поддерживает , но добиться этого у меня так и не вышла, там нужна какая-то магия с правильными версиями библиотек, параметрами подключений и прочим.

А можно ли просто вернуть из процедуры набор данных, как это делает select-запрос, без параметров, циклов, коллекций и прочего?
В MS SQL это делалось тривиально (просто в любом месте процедуры вызывался select-запрос) и порою это было удобно.
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045776
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045783
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Табличные функции точно нет. Их и использовать неудобно, и ограничений много.
Представление с параметрами это интересно, но у меня задача совершенно другая.
У меня нет параметров, я мог бы и обычное представление использовать (или сразу select-запрос).
Но я хотел бы из скрипта вызывать процедуру (через exec), но в ответе получать набор данных (как для select).
Так сделать нельзя?
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045789
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По ссылке хоть ходил? )))
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045794
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBMS_SQL.RETURN_RESULT(cur) ?
Да, это бы подошло, но у меня версия старая.
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045801
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
DBMS_SQL.RETURN_RESULT(cur) ?
Да, это бы подошло, но у меня версия старая.

Тогда терпите.
Стисните зубы, сожмите кулаки и терпите!

Мы вместе с вами повздыхаем и виртуально похлопаем по плечу.
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045810
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле, мне не понятно, что такое в pipilened function "использовать неудобно, и ограничений много"

Для табличных функций у меня было самое большое недобство, что необходимо создавать типы в базе. Не люблю я, когда в базе код (типы) вне пакетов ))).

Но вроде "в отличие от обычных табличных функций, конвейерные табличные функции могут быть определены с использованием типов "table" и "record", определенных в спецификации пакета."

Но да, возврашаемые типы придется описывать и какой-то код писать. Но если в проекте таких мест много, то можно и кодогенератор за пару дней сделать и необходимые pipilened function просто кодогенерить.

IMHO
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045816
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или разбираться с библиотекой. Вроде же действительно написано, что курсоры поддерживаются.
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045842
mnbvcx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev

Для табличных функций у меня было самое большое неудобство, что необходимо создавать типы в базе. Не люблю я, когда в базе код (типы) вне пакетов ))).

Но вроде "в отличие от обычных табличных функций, конвейерные табличные функции могут быть определены с использованием типов "table" и "record", определенных в спецификации пакета."

Ну да, оба типа в пакете определил, а дальше пайплайн в том же пакете. Зафига что-то другое придумывать?
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045955
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
"в отличие от обычных табличных функций, конвейерные табличные функции могут быть определены с использованием типов "table" и "record", определенных в спецификации пакета."
могут, но БД всё равно неявно создаст для них системные объекты схемы с префиксом SYS_PLSQL.
...
Рейтинг: 0 / 0
Как вернуть recordset в процедуре?
    #40045964
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных мореймогут, но БД всё равно неявно создаст для них системные объекты схемы с префиксом SYS_PLSQL.
Зависит от версии: Pipeline Function Returning UDT Defined in the Package Specification Raises ORA-00902 Post Database Upgrade to 18c (Doc ID 2696498.1)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как вернуть recordset в процедуре?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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