powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / p_cursor out sys_refcursor - прикрутить в APEX малой кровью
12 сообщений из 12, страница 1 из 1
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #35582106
Фотография RA\/EN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос, наверное, ламерский, но мы не стеснительные
Есть куча кода, который возвращает выборки с помощью out-параметра SYS_REFCURSOR.
Процедуры выглядят где-то так:
Код: plaintext
1.
2.
3.
4.
procedure proc(
 p_1 in number,
 p_2 in date,
 p_3 in varchar2,
 p_cursor out sys_refcursor);
Вопрос - как бы их попроще использовать в LOV и отчетах APEX?
Насколько я понял, APEX хочет текст запроса либо напрямую, либо чтобы его возвращала процедура, но это наводит на грустную мысль о написании мега-обертки, конвертирующей курсор с данными в запрос, его возвращающий, что пугает.
Есть ли ПРОСТОЙ способ пользовать такие процедуры как источники данных для LOV и отчетов? С наскоку в документации/форумах по этой теме ничего не нашел :(
P.S. Apex будет использоваться встроенный в 11g.
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #35583072
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С лёту идея такая:
написать функцию обертку, которая будет возвращать этот самый refcursor и использовать её в запросах. Допустим есть процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
create or replace
procedure p (p_out out sys_refcursor) as
begin
  open p_out for select table_name, tablespace_name from user_tables;  
end;
/

Функция будет выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
create or replace function f return sys_refcursor as 
  lret sys_refcursor;
begin
  p(lret);
  return lret;  
end;

Запрос для репорта или LOV примерно так:
Код: plaintext
1.
2.
3.
select extract(column_value, '//TABLE_NAME/text()'), extract(column_value, '//TABLESPACE_NAME/text()') from 
table(xmlsequence(f()))
/

Причесать только всё это дело, я особо с рефкурсорами и вложенными таблицами не работал, наверняка можно и красивее запрос сделать.
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #35583392
apex_users_guide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pipelined function
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #35612011
Tamozhnya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отчетам все равно нужна структура таблицы.
Поэтому я дорабатываю процедуры:
делаю временные таблицы (tt_table_name), в конце таблицы сливаю в ней данный,
а уже потом открываю курсор - Open rc1 for Select*from tt_table_name;
Сохраняется старая функциональность, и в отчете можно использовать данные из tt_table_name
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #38092108
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RA\/ENВопрос, наверное, ламерский, но мы не стеснительные
Есть куча кода, который возвращает выборки с помощью out-параметра SYS_REFCURSOR.
Процедуры выглядят где-то так:
Код: sql
1.
2.
3.
4.
5.
procedure proc(
 p_1 in number,
 p_2 in date,
 p_3 in varchar2,
 p_cursor out sys_refcursor);


Вопрос - как бы их попроще использовать в LOV и отчетах APEX?
Насколько я понял, APEX хочет текст запроса либо напрямую, либо чтобы его возвращала процедура, но это наводит на грустную мысль о написании мега-обертки, конвертирующей курсор с данными в запрос, его возвращающий, что пугает.
Есть ли ПРОСТОЙ способ пользовать такие процедуры как источники данных для LOV и отчетов? С наскоку в документации/форумах по этой теме ничего не нашел :(
P.S. Apex будет использоваться встроенный в 11g.Абсолютно аналогичная ситуация возникла.
Я правильно понимаю, что за прошедшие 4 года ничего нового для работы с sys_refcursor в апексе не появилось?
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #38092283
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimber,

Зачем вообще нужно SYS_REFCURSOR куда-то передавать всюду?

И вообще, работать с SYS_REFCURSOR не пугает, а написать обертку пугает?


Ответ уже был дан: pipelined function
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #38092326
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevrockclimber,

Зачем вообще нужно SYS_REFCURSOR куда-то передавать всюду?Мне - не нужно. Просто я нарасхваливал апекс, все слушали развесив уши, а потом сказали - "да, круто, но SYS_REFCURSOR и нее... это самое". Теперь вот думаю, как все это спихнуть с себя или переубедить.

SvDevИ вообще, работать с SYS_REFCURSOR не пугает, а написать обертку пугает?
Есть работающая хрень в экселе - по функционалу идентичная Tabular Form (UPDATE нескольких строк сразу в таблице). Она собирает данные в строку особого формата, через VBA и ODBC вызывает процедуру с рефкурсором, пихает в нее ту строку, получает назад курсор с результатами, рисует его в экселе. Когда я представляю, как буду рисовать сам с нуля Tabular Form с помощью PL/SQL и javascript - плакать хочется

SvDevОтвет уже был дан: pipelined functionТак вопрос был не "как", а "как еще, кроме написанного в топике". Ну раз обертки - пусть будут обертки. Пойду оберточной бумагой запасаться
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #38092395
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimberКогда я представляю, как буду рисовать сам с нуля Tabular Form с помощью PL/SQL и javascript
Если 11g всё вообще довольно весело: (пример без pipelined)

1. Создается оракловая коллекция, по аналогии того что любят разработчики апекса: штук 100 универсальных полей varchar2 + по необходимости clob;
2. Процедура, которая принимает refcursor, refcursor_name, выполняет его и пишет результат в коллекцию. Тут еще пригодится dbms_sql, который позволяет получить количество и типы столбцов.
3. Вьюшка (что-нибудь типа: create view as select refcursor_name, v1..v100 from table(collection))
4. instead of триггер на вьюшку, который пишет изменения в базу, в зависимости от refcursor_name (чтобы не писать свою обертку для каждой процедуры)
5. Tabular Form на вьюшку
6. Before Header процесс, с вызовом процедуры из п.2.
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #38092414
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю, если количество столбцов заранее неизвестно и нужен tabular form:

7. во всех столбцах добавить условие:
номер столбца < количество столбцов в курсоре, сохраненное где-нибудь на этапе 2.

8. Имена колонок делаем тип PL/SQL, вычисляем (dbms_sql)

потом всю эту можно копировать вместе со страницей, зато без DDL
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #38092458
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevДобавлю, если количество столбцов заранее неизвестно и нужен tabular form:

7. во всех столбцах добавить условие:
номер столбца < количество столбцов в курсоре, сохраненное где-нибудь на этапе 2.

8. Имена колонок делаем тип PL/SQL, вычисляем (dbms_sql)

потом всю эту можно копировать вместе со страницей, зато без DDL
У нас нет задачи сделать всенепременно на апексе. Просто у начальства есть пожелание перенести на веб-странички то, что делается в экселе и PL/SQL Developer'е. Мне проще сказать что апекс "не взлетит" (тем более при таких требованиях он и правда может не взлететь), а начальство пусть само думает, на чем делать.
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #38098337
Скороход
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИМХО, вы боитесь не того, чего нужно бояться. Ничего плачевного в самодельном табуляре нет. Но если стоит задача всё сделать сверхмалой кровью - то APEX, пожалуй, не лучший вариант в свете SYS_REFCURSOR. И вообще веб в целом. Зачем вам вообще веб-странички? Хотите уйти от Excel?
...
Рейтинг: 0 / 0
p_cursor out sys_refcursor - прикрутить в APEX малой кровью
    #38099050
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если использовать функцию вместо (или вокруг) процедуры, а количество столбцов в результирующем курсоре фиксировано, то можно завернуть в XMLTABLE, это проще всего.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create or replace function f 
  return sys_refcursor
as
  l_result sys_refcursor;
begin
  open l_result for
    select * from emp;
 
  return l_result;
end;
/

select ename, empno
  from xmltable(
    '/ROWSET/ROW'
     passing xmltype(f) 
     columns
       empno number(10) path 'EMPNO',
       ename varchar2(10) path 'ENAME')
/
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / p_cursor out sys_refcursor - прикрутить в APEX малой кровью
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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