Возврат refcursor-а посредством NDS через промемежуточную переменную

Elic
Дата: 26.05.2006 16:16:12
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
SQL> var c refcursor
SQL> set autop on
SQL> 
SQL> begin
SQL>   execute immediate 'begin open :c for select * from dual; end;' using out :c;
SQL> end;
SQL> /

PL/SQL procedure successfully completed.


D
-
X

SQL> 
SQL> declare
SQL>   fCur sys_refcursor;
SQL> begin
SQL>   execute immediate 'begin open :c for select * from dual; end;' using out fCur;
SQL> end;
SQL> /
declare
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Что здесь не так? Подобного никто не пробовал делать?

Вообще задача состоит в возврате refcursor-а из функции, в которую передаётся в качестве параметра имя другой функции, возвращающей refcursor.
dmidek
Дата: 26.05.2006 16:27:48
В 10.1.0.2 выдается ORA-06537, курсор декларируется как IN/OUT и все в порядке

declare
   v_dummy date;
   fCur sys_refcursor;
 begin
   execute immediate 'begin open :c for select sysdate from dual; end;' using in out fCur;
   fetch fcur INTO v_dummy;
   dbms_output.put_line(v_dummy);
end;

26-MAI-2006

А в 9ке IN OUT не помогает, вылетаю
Andrew Max
Дата: 26.05.2006 18:19:38
SQL> conn max
Введите пароль:
Соединено.
SQL>
SQL> show rel
release 902000600
SQL>
SQL> declare
  2    v_dummy date;
  3    fCur sys_refcursor;
  4  begin
  5    execute immediate 'begin open :c for select sysdate from dual; end;' using in out fCur;
  6    fetch fcur INTO v_dummy;
  7    dbms_output.put_line(v_dummy);
  8  end;
  9  /
ERROR:
ORA-03114: нет связи с ORACLE


declare
*
ошибка в строке 1:
ORA-03113: принят сигнал конца файла по коммуникационному каналу


SQL> conn max
Введите пароль:
Соединено.
SQL>
SQL> set serveroutput on
SQL>
SQL> declare
  2    v_dummy date;
  3    fCur sys_refcursor;
  4  begin
  5    OPEN fCUR FOR 'SELECT * FROM DUAL'; -- Wow!...
  6    execute immediate 'begin open :c for select sysdate from dual; end;' using in out fCur;
  7    fetch fcur INTO v_dummy;
  8    dbms_output.put_line(v_dummy);
  9  end;
 10  /
26.05.06

Процедура PL/SQL успешно завершена.

SQL>

Elic
Дата: 26.05.2006 18:49:17
Andrew Max
  5    OPEN fCUR FOR 'SELECT * FROM DUAL'; -- Wow!...
  6    execute immediate 'begin open :c for select sysdate from dual; end;' using in out fCur;
Спасибо! Значит надо было проинициализировать.
andrey_anonymous
Дата: 26.05.2006 18:58:03
Elic
Andrew Max
  5    OPEN fCUR FOR 'SELECT * FROM DUAL'; -- Wow!...
  6    execute immediate 'begin open :c for select sysdate from dual; end;' using in out fCur;
Спасибо! Значит надо было проинициализировать.

Я бы проследил за незакрытыми курсорчиками...
В десятке-то в изначальном io-out варианте работает...
От греха.
Elic
Дата: 26.05.2006 19:04:37
andrey_anonymous
Я бы проследил за незакрытыми курсорчиками...
От греха.
У самого такие мысли есть. Но главное, что есть сдвиг.
mcureenab
Дата: 26.05.2006 19:29:04
Elic
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Что здесь не так?


Может быть в журналах сервера ответ поискать? Обычно такие вещи на сервере бесследно не проходят.
Трассировочку интересно посмотреть, на каком шаге PL/SQL кода связь прерывается?
Elic
Дата: 26.05.2006 20:09:20
mcureenab
Может быть в журналах сервера ответ поискать? Обычно такие вещи на сервере бесследно не проходят.
Трассировочку интересно посмотреть, на каком шаге PL/SQL кода связь прерывается?
В "нормальной" части трассы ничего интересного - заканчивается на успешном исполнении курсора с select-ом.
win-cdump
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
Process Id: 0x00000b58 Thread Id : 0x00000a38 Time : Fri May 26 18:38:23
Excp. Code: 0xc0000005 Excp. Type: ACCESS_VIO Flags: 0x00000000
linux-udump
Exception signal: 11 (SIGSEGV), code: 1 (Address not mapped to object), addr: 0xc, PC: [0x81f6dce, kprcdt()+3870]
Registers:
%eax: 0x00000000 %ebx: 0x00000004 %ecx: 0x00000001
%edx: 0x00000004 %edi: 0x0000000c %esi: 0xb74c15d0
%esp: 0xbfff5a60 %ebp: 0xbfff5b30 %eip: 0x081f6dce
%efl: 0x00010202
kprcdt()+3861 (0x81f6dc5) mov 0xc(%ebp),%esi
kprcdt()+3864 (0x81f6dc8) mov %ebx,%ecx
kprcdt()+3866 (0x81f6dca) push %ecx
kprcdt()+3867 (0x81f6dcb) shr $0x2,%ecx
> kprcdt()+3870 (0x81f6dce) repe movs (%esi),(%edi)
kprcdt()+3872 (0x81f6dd0) pop %ecx
kprcdt()+3873 (0x81f6dd1) and $3,%ecx
kprcdt()+3876 (0x81f6dd4) repe movsb (%esi),(%edi)
kprcdt()+3878 (0x81f6dd6) movzb 0x14(%ebp),%eax
*** 2006-05-26 14:54:14.185
ksedmp: internal or fatal error
ORA-07445: exception encountered: core dump [kprcdt()+3870] [SIGSEGV] [Address not mapped to object] [0xC] [] []
Current SQL statement for this session:
begin open :c for select * from dual; end;
Но от этого не легче :)
dmidek
Дата: 26.05.2006 20:35:49
Elic, полез в металинк и нашел ИМХО что то похожее

Bug 4485590
Elic
Дата: 26.05.2006 20:54:42
dmidek
Bug 4485590
Спасибо. Почитал. Похоже, но без workaround-ов под 9-ку.