|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
Есть периодически запускаемый скрипт, который при запуске получает некоторый набор данных (select), а затем проходит в цикле по полученному набору, извлекает из него определенный идентификатор и вызывает процедуру, передавая в нее полученный идентификатор. По некоторым причинам мне бы хотелось получать исходный набор данных не select-запросом, а также вызывая процедуру (exec), которая бы вернула набор данных. Подобная процедура выглядит примерно так: Код: plsql 1. 2. 3. 4. 5.
И после ее выполнения я получаю нужные данные из параметра :RECORDSET. В PHP клиентская библиотека (OCI8) частично поддерживает тип данных CURSOR, поэтому в скриптах на PHP такой способ работает. Но у меня также есть скрипты на Perl, а там клиентская библиотека курсоры вроде бы поддерживает , но добиться этого у меня так и не вышла, там нужна какая-то магия с правильными версиями библиотек, параметрами подключений и прочим. А можно ли просто вернуть из процедуры набор данных, как это делает select-запрос, без параметров, циклов, коллекций и прочего? В MS SQL это делалось тривиально (просто в любом месте процедуры вызывался select-запрос) и порою это было удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 10:22 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
AFAIK 1. Pipilened Function https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm#CHDJEGHC 2. Сам так не делал View и параметры ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 14:18 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
Табличные функции точно нет. Их и использовать неудобно, и ограничений много. Представление с параметрами это интересно, но у меня задача совершенно другая. У меня нет параметров, я мог бы и обычное представление использовать (или сразу select-запрос). Но я хотел бы из скрипта вызывать процедуру (через exec), но в ответе получать набор данных (как для select). Так сделать нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 14:26 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
По ссылке хоть ходил? ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 14:32 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
DBMS_SQL.RETURN_RESULT(cur) ? Да, это бы подошло, но у меня версия старая. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 14:42 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
Alibek B. DBMS_SQL.RETURN_RESULT(cur) ? Да, это бы подошло, но у меня версия старая. Тогда терпите. Стисните зубы, сожмите кулаки и терпите! Мы вместе с вами повздыхаем и виртуально похлопаем по плечу. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 14:57 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
На самом деле, мне не понятно, что такое в pipilened function "использовать неудобно, и ограничений много" Для табличных функций у меня было самое большое недобство, что необходимо создавать типы в базе. Не люблю я, когда в базе код (типы) вне пакетов ))). Но вроде "в отличие от обычных табличных функций, конвейерные табличные функции могут быть определены с использованием типов "table" и "record", определенных в спецификации пакета." Но да, возврашаемые типы придется описывать и какой-то код писать. Но если в проекте таких мест много, то можно и кодогенератор за пару дней сделать и необходимые pipilened function просто кодогенерить. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 15:07 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
Ну или разбираться с библиотекой. Вроде же действительно написано, что курсоры поддерживаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 15:16 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Для табличных функций у меня было самое большое неудобство, что необходимо создавать типы в базе. Не люблю я, когда в базе код (типы) вне пакетов ))). Но вроде "в отличие от обычных табличных функций, конвейерные табличные функции могут быть определены с использованием типов "table" и "record", определенных в спецификации пакета." Ну да, оба типа в пакете определил, а дальше пайплайн в том же пакете. Зафига что-то другое придумывать? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 16:08 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev "в отличие от обычных табличных функций, конвейерные табличные функции могут быть определены с использованием типов "table" и "record", определенных в спецификации пакета." ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 18:44 |
|
Как вернуть recordset в процедуре?
|
|||
---|---|---|---|
#18+
кит северных мореймогут, но БД всё равно неявно создаст для них системные объекты схемы с префиксом SYS_PLSQL. Зависит от версии: Pipeline Function Returning UDT Defined in the Package Specification Raises ORA-00902 Post Database Upgrade to 18c (Doc ID 2696498.1) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 18:58 |
|
|
start [/forum/topic.php?fid=52&fpage=25&tid=1880435]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 150ms |
0 / 0 |