Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 вопрос по SYS_REFCURSOR  [new]
mgtu
Member

Откуда:
Сообщений: 123
Есть код на самом верхнем уровне которого надо фетчить ссылочный курсор. Но при вложенности передачи больше 2 уровне ничего невозвращается.
DECLARE
   l_cur   sys_refcursor;
   l_n     NUMBER;
   l_c     VARCHAR2 (4000);
   l_id    NUMBER DEFAULT 1;
BEGIN
   pkg_main.state (p_id_sklad => l_id, p_cur_state => l_cur);

   LOOP
      FETCH l_cur
       INTO l_n, l_c;

      EXIT WHEN l_cur%NOTFOUND;
      DBMS_OUTPUT.put_line (l_n || '*' || l_c);
   END LOOP;
END;
/

...pkg_main
procedure state (p_id_sklad in number, p_cur_state out sys_refcursor)
is
begin
  --Тут стэк процедур которые надо выполнить
  pkg_other.proc_1(...);
  pkg_other.proc_2(...);
  pkg_other.proc_3(.., proc_3_cur => p_cur_state);--эта проц. вернет курсор
end;
/

...pkg_other
procedure proc_3 (..., proc_3_cur out sys_refcursor)
is
begin
  open proc_3_cur from (select....);
end;
/

Фетч отлично работает если его сделать в state, но выше в неименованом блоке никак.
18 окт 06, 11:41    [3275488]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по SYS_REFCURSOR  [new]
LVA
Member

Откуда: Санкт-Петербург
Сообщений: 231
автор
DECLARE
l_cur sys_refcursor;
l_n NUMBER;
l_c VARCHAR2 (4000);
l_id NUMBER DEFAULT 1;

procedure proc_3 (proc_3_cur out sys_refcursor)
is
begin
open proc_3_cur
for select num, name from (
select 1 num, 'name1' name from dual union all select 2, 'name2' from dual
);
end;

procedure state (p_id_sklad in number, p_cur_state out sys_refcursor)
is
begin
proc_3(proc_3_cur => p_cur_state);--эта проц. вернет курсор
end;

BEGIN

state (l_id,l_cur);

LOOP
FETCH l_cur
INTO l_n, l_c;

EXIT WHEN l_cur%NOTFOUND;
DBMS_OUTPUT.put_line (l_n || '*' || l_c);
END LOOP;
END;
/


автор
1*name1
2*name2
18 окт 06, 11:55    [3275607]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по SYS_REFCURSOR  [new]
Elic
Member

Откуда:
Сообщений: 29991
mgtu

RTFM
create function tmp_a return sys_refcursor
is
  c sys_refcursor;
begin
  open c for select power(2, rownum) as n from all_objects where rownum < 10;
  return c;
end tmp_a;
/

create function tmp_b return sys_refcursor
is
begin
  return tmp_a;
end tmp_b;
/

create function tmp_c return sys_refcursor
is
begin
  return tmp_b;
end tmp_c;
/

create function tmp_d return sys_refcursor
is
begin
  return tmp_c;
end tmp_d;
/

var c refcursor
exec :c := tmp_d
print c

            N
-------------
            2
            4
            8
           16
           32
           64
          128
          256
          512

9 rows selected.

declare
  x int;
  c sys_refcursor;
begin
  c := tmp_d;
  loop 
    fetch c into x;
    exit when c%notfound;
    dbms_output.put_line(x);
  end loop;
  close c;
end;
/

2
4
8
16
32
64
128
256
512

PL/SQL procedure successfully completed.
18 окт 06, 12:03    [3275698]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить