Не закрывается sys_refcursor

serg4321
Дата: 07.03.2007 10:16:57
Всем добрый день!

Подскажите, пожалуйста, почему код в первом случае не работает, а во втором работает?

declare
 s sys_refcursor;
  
 procedure proc(proc_s out sys_refcursor)
 as
 begin
  open proc_s for 'select * from dual';
 end;
  
 procedure main_proc(main_proc_s out sys_refcursor)
 as
 begin
  proc(main_proc_s);
 end;

begin
 main_proc(s);
 
 close s;
end;
/

ORA-01001: invalid cursor
ORA-06512: at line 21


-------------------------------------------------

declare
 s sys_refcursor;
 
 procedure proc(proc_s out sys_refcursor)
 as
 begin
  open proc_s for 'select * from dual';
 end;
 
 procedure main_proc(main_proc_s out sys_refcursor)
 as
 begin
  proc(main_proc_s); --<<<< Изменение только здесь!
 end;

begin
 proc(s);
 
 close s;
end;
/

PL/SQL procedure successfully completed

В доке на эту тему ничего не нашел... Заранее спасибо за ответы!
andrey_anonymous
Дата: 07.03.2007 10:23:42
Рецепт от Elic:
SQL> declare
  2   s sys_refcursor;
  3  
  4   procedure proc(proc_s out sys_refcursor)
  5   as
  6   begin
  7    open proc_s for 'select * from dual';
  8   end;
  9  
 10   procedure main_proc(main_proc_s out sys_refcursor)
 11   as
 12   begin
 13    open main_proc_s for 'select 1 a from dual';
 14    close main_proc_s;
 15    proc(main_proc_s);
 16   end;
 17  
 18  begin
 19   main_proc(s);
 20  
 21   close s;
 22  end;
 23  /

PL/SQL procedure successfully completed

SQL> 
serg4321
Дата: 07.03.2007 10:30:46
Сорри, описался

declare
 s sys_refcursor;
  
 procedure proc(proc_s out sys_refcursor)
 as
 begin
  open proc_s for 'select * from dual';
 end;
  
 procedure main_proc(main_proc_s out sys_refcursor)
 as
 begin
  proc(main_proc_s);
 end;

begin
 main_proc(s);
 
 close s;
end;
/

ORA-01001: invalid cursor
ORA-06512: at line 21


-------------------------------------------------

declare
 s sys_refcursor;
 
 procedure proc(proc_s out sys_refcursor)
 as
 begin
  open proc_s for 'select * from dual';
 end;
 
 procedure main_proc(main_proc_s out sys_refcursor)
 as
 begin
  proc(main_proc_s);
 end;

begin
 proc(s); --<<<< Изменение только здесь!
 
 close s;
end;
/

PL/SQL procedure successfully completed

2 andrey_anonymous
Спасибо, а это что, баг Оракла?
Elic
Дата: 07.03.2007 10:30:56
STFF Возврат refcursor-а посредством NDS через промемежуточную переменную

P.S. Изменение только "не там" :)

_______________________________________________________________________________________

2 andrey_anonymous
Только не "от", а "для" :)
Elic
Дата: 07.03.2007 10:33:06
serg4321
Дата: 07.03.2007 11:24:46
2 Elic
Спасибо!