Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / sys_refcursor в составлении запроса / 15 сообщений из 15, страница 1 из 1
09.10.2018, 22:25
    #39715202
Retvit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
Можно ли использовать переменную sys_refcursor в составлении запроса

т.е. вместо
Код: plsql
1.
2.
3.
4.
5.
begin
  open v_cursor for
    select dummy, cursor(select 1 id from dual) cr from dual;
end;
/



у нас есть уже открытый курсор, который и нужно поместить в конструкцию запроса
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
  v_c   sys_refcursor;
begin
  open v_c for select 1 id from dual;

  open v_cursor for
    select dummy, v_c  cr from dual;
end;
/
...
Рейтинг: 0 / 0
09.10.2018, 22:59
    #39715214
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
Retvit,

курсор может быть параметром функции, используемой в sql-запросе.
...
Рейтинг: 0 / 0
09.10.2018, 23:13
    #39715221
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
Retvit,

Результирующий набор данных открытого курсора уже предопределен, он не зависит от второго курсора, смысл такой конструкции непонятен.

Возможность создать вложенный курсор есть CURSOR Expressions
...
Рейтинг: 0 / 0
10.10.2018, 01:40
    #39715281
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
Retvit,

да, и это же легко проверить в вашем же коде парой строчек:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare
  v_c   sys_refcursor;
  v_cursor sys_refcursor;
  
  res_dummy  dual.dummy%type;
  res_cursor sys_refcursor;
  res_id     int;
begin
  open v_c for select 1 id from dual;

  open v_cursor for
    select dummy, v_c  cr from dual;
  
  fetch v_cursor into res_dummy,res_cursor;
  fetch res_cursor into res_id;

  dbms_output.put_line('dummy = '||res_dummy);
  dbms_output.put_line('id    = '||res_id);
end;
/
...
Рейтинг: 0 / 0
10.10.2018, 08:45
    #39715356
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
xtender,

я так понял Retvit хочет
Код: plsql
1.
2.
3.
4.
5.
6.
...
begin
  open v_cursor for
    select dummy, cursor(v_cursor) cr from dual;
end;
/




.....
stax
...
Рейтинг: 0 / 0
10.10.2018, 09:07
    #39715365
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
Staxя так понял Retvit хочетДаже, если и так. И что??
Retvitпоместить в конструкцию запросаВ чем смысл курсора из дуала, возвращающего курсор?
...
Рейтинг: 0 / 0
10.10.2018, 19:55
    #39715765
Retvit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
Я не смог вчера сразу понять ошибку, думал это именно наличие sys_refcursor в курсоре все портит.

Мне нужно получить данные (в примере таблицы) + на каждую строку курсор (в примере v$version), который будет потом конвертироваться в XML.

Если возвращаемая строка одна, то ок, если несколько - ошибка, из-за того, что курсор v_c уже прочитан.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
declare
  v_cursor      sys_refcursor;
  v_c           sys_refcursor;
  xmldoc        xmltype;
  ctx           number;
  v_table_name  varchar2(30);
  v_sub_curr    sys_refcursor;
begin
  open v_c for select * from v$version;
 
  open v_cursor for select table_name, v_c cr from dba_tables where rownum <= 2; --> Error
  --open v_cursor for select table_name, cursor( select * from v$version ) cr from dba_tables where rownum <= 2; --> Работает
 
  loop
    fetch v_cursor into v_table_name, v_sub_curr;
    exit when v_cursor%notfound;
   
    dbms_output.put_line( v_table_name );
   
    ctx := dbms_xmlgen.newcontext(v_sub_curr);
    xmldoc := dbms_xmlgen.getxmltype(ctx);
    dbms_output.put_line( xmldoc.getstringval() );
  end loop;
end;



Так что хотелось бы понять, можно как-то с переменной sys_refcursor получить поведение с cursor(), переоткрыть ее что ли.
...
Рейтинг: 0 / 0
10.10.2018, 20:34
    #39715781
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
RetvitМне нужно получить данные (в примере таблицы) + на каждую строку курсор (в примере v$version)Какой смысл в каждой строке возвращать один и тот же курсор?

Retvitкоторый будет потом конвертироваться в XML.Зачем сейчас извращаться с вложенным курсором, если он потом не нужен как курсор?
...
Рейтинг: 0 / 0
10.10.2018, 20:49
    #39715785
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
Retvit,

Похоже ты курсоры перепутал:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
declare
    v_cursor     sys_refcursor;
    xmldoc       xmltype;
    ctx          number;
    v_banner     varchar2(80);
    v_table_name varchar2(80);
    v_sub_curr   sys_refcursor;
begin
    open v_cursor for select banner,cursor(select table_name from dba_tables where rownum <= 10) from v$version;
    fetch v_cursor into v_banner,v_sub_curr;
    ctx := dbms_xmlgen.newcontext(v_sub_curr);
    xmldoc := dbms_xmlgen.getxmltype(ctx);
    dbms_output.put_line(xmldoc.getstringval());
end;
/
<ROWSET>
 <ROW>
  <TABLE_NAME>IND$</TABLE_NAME>
 </ROW>
 <ROW>

<TABLE_NAME>CDEF$</TABLE_NAME>
 </ROW>
 <ROW>
  <TABLE_NAME>CLU$</TABLE_NAME>

</ROW>
 <ROW>
  <TABLE_NAME>UNDO$</TABLE_NAME>
 </ROW>
 <ROW>

<TABLE_NAME>CCOL$</TABLE_NAME>
 </ROW>
 <ROW>

<TABLE_NAME>PROXY_ROLE_DATA$</TABLE_NAME>
 </ROW>
 <ROW>

<TABLE_NAME>FET$</TABLE_NAME>
 </ROW>
 <ROW>
  <TABLE_NAME>CON$</TABLE_NAME>

</ROW>
 <ROW>
  <TABLE_NAME>ICOL$</TABLE_NAME>
 </ROW>
 <ROW>

<TABLE_NAME>COL$</TABLE_NAME>
 </ROW>
</ROWSET>


PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
10.10.2018, 21:16
    #39715800
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
Вернее:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
declare
    v_cursor     sys_refcursor;
    xmldoc       xmltype;
    ctx          number;
begin
    open v_cursor
      for
        with t as (
                   select  listagg(banner,' ') within group(order by rownum) banner
                     from  v$version
                  )
        select  banner,
                cursor(select table_name from  dba_tables where rownum <= 3) table_name
          from  t;
    ctx := dbms_xmlgen.newcontext(v_cursor);
    xmldoc := dbms_xmlgen.getxmltype(ctx);
    dbms_output.put_line(xmldoc.getstringval());
end;
/
<ROWSET>
 <ROW>
  <BANNER>Oracle Database 12c Enterprise Edition Release
12.2.0.1.0 - 64bit Production PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production TNS for 64-bit Windows: Version 12.2.0.1.0 -
Production NLSRTL Version 12.2.0.1.0 - Production</BANNER>
  <TABLE_NAME>

<TABLE_NAME_ROW>
    <TABLE_NAME>IND$</TABLE_NAME>
   </TABLE_NAME_ROW>

<TABLE_NAME_ROW>
    <TABLE_NAME>CDEF$</TABLE_NAME>
   </TABLE_NAME_ROW>

<TABLE_NAME_ROW>
    <TABLE_NAME>CLU$</TABLE_NAME>
   </TABLE_NAME_ROW>

</TABLE_NAME>
 </ROW>
</ROWSET>


PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
10.10.2018, 21:35
    #39715806
Retvit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
-2-RetvitМне нужно получить данные (в примере таблицы) + на каждую строку курсор (в примере v$version)Какой смысл в каждой строке возвращать один и тот же курсор?

Пример придумать нетрудно =)
Составляется список таблиц для обзвона, в поле идут 3 вопроса к ним из заготовленного списка.
А одинаковые, потому что система сначала готовит списки вопросов и потом формирует к ним батчи с таблицами.
-2-Retvitкоторый будет потом конвертироваться в XML.Зачем сейчас извращаться с вложенным курсором, если он потом не нужен как курсор?
На вход будет приходить sys_refcursor
...
Рейтинг: 0 / 0
10.10.2018, 21:36
    #39715807
Retvit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
SY,
Ты не понял суть вопроса =(
...
Рейтинг: 0 / 0
10.10.2018, 22:20
    #39715827
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
RetvitТак что хотелось бы понять, можно как-то с переменной sys_refcursor получить поведение с cursor(), переоткрыть ее что ли.
Можно open -> xml -> close внутри цикла, но не нужно, первый курсор будет возвращать все время один и тот же результат, зачем выполнять один и тот же запрос много раз, если ты сразу можешь сформировать xml-объект и далее использовать его.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare
  v_cursor      sys_refcursor;
  v_c           sys_refcursor;
  xmldoc        xmltype;
  ctx           number;
  v_table_name  varchar2(30);
begin
  open v_c for select * from v$version;
  ctx := dbms_xmlgen.newcontext(v_c);
  xmldoc := dbms_xmlgen.getxmltype(ctx);
  close v_c;

  open v_cursor for select table_name from dba_tables where rownum <= 2;
  loop
    fetch v_cursor into v_table_name;
    exit when v_cursor%notfound;

    dbms_output.put_line( v_table_name );
    dbms_output.put_line( xmldoc.getstringval() );
  end loop;
  close v_cursor;
end;
...
Рейтинг: 0 / 0
10.10.2018, 23:35
    #39715849
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
RetvitПример придумать нетрудно =)
Составляется список таблиц для обзвона, в поле идут 3 вопроса к ним из заготовленного списка.


Ну и зачем тут PL/SQL?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
SQL> select  *
  2    from  questions
  3  /

QUESTION
------------------------
question 1
question 2
question 3

with t1 as (
            select  xmlagg(xmlelement("question",question)) questions
              from questions
           ),
     t2 as (
            select  xmlagg(xmlelement("responder",ename)) responders
              from  emp
           )
select  xmlserialize(
                     document
                     xmlelement(
                                "survey",
                                 xmlelement("questions",questions),
                                 xmlelement("responders",responders)
                               )
                     indent size = 2
                    ) survey
  from  t1,
        t2
/

SURVEY
--------------------------------------
<survey>
  <questions>
    <question>question 1</question>
    <question>question 2</question>
    <question>question 3</question>
  </questions>
  <responders>
    <responder>SMITH</responder>
    <responder>ALLEN</responder>
    <responder>WARD</responder>
    <responder>JONES</responder>
    <responder>MARTIN</responder>
    <responder>BLAKE</responder>
    <responder>CLARK</responder>
    <responder>SCOTT</responder>
    <responder>KING</responder>
    <responder>TURNER</responder>
    <responder>ADAMS</responder>
    <responder>JAMES</responder>
    <responder>FORD</responder>
    <responder>MILLER</responder>
  </responders>
</survey>


SQL> 



SY.
...
Рейтинг: 0 / 0
11.10.2018, 13:55
    #39716131
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sys_refcursor в составлении запроса
Retvit,

Да можно и так, лиж бы ручки не болели
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
with questions as (select 'question 1' QUESTION from dual union all
                   select 'question 2' QUESTION from dual union all
                   select 'question 3' QUESTION from dual) 
,responder as (select 'resp1' Name from dual union all
               select 'resp2' Name from dual union all
               select 'resp13' Name from dual)
,t2 as (
            select  xmlagg(xmlelement("responder",Name)) responders
              from  responder
           )
           
select  xmlserialize(
                     document
                     xmlelement(
                                "survey",
                                 xmlagg(xmlelement("responders", xmlattributes(QUESTION as "QUESTION"), responders))
                               )
                     indent size = 2
                    ) survey
  from  questions,
        t2

<survey>
  <responders QUESTION="question 1">
    <responder>resp1</responder>
    <responder>resp2</responder>
    <responder>resp13</responder>
  </responders>
  <responders QUESTION="question 2">
    <responder>resp1</responder>
    <responder>resp2</responder>
    <responder>resp13</responder>
  </responders>
  <responders QUESTION="question 3">
    <responder>resp1</responder>
    <responder>resp2</responder>
    <responder>resp13</responder>
  </responders>
</survey>
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / sys_refcursor в составлении запроса / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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