пеоедача значения по ссылке (REF CURSOR)

срочновномер
Дата: 05.12.2007 17:27:12
нужно передать значение переменной, получаемой в курсоре, по ссылке, что-то вроде

PROCEDURE aaa IS
Begin
   For x In (Select a1, b2 .. From aaa, bbb..) -- имеем тут неявный REF CURSOR
   Loop
       bbb (x);
   End Loop;
End;  

PROCEDURE bbb (xx IN ???) IS
BEGIN
     DBMS_OUTPUT.PUT_LINE(xx.a1);
     DBMS_OUTPUT.PUT_LINE(xx.b1);
END;

Основное условие - селект "
Select a1, b2 .. From aaa, bbb..
" весьма сложный (десятки таблиц), и достаточно он часто модифицируется, т.е. создавать для него отдельный типа неудобно.

правильно ли я понимаю, что Оракл (9i и 10g) не умеет передавать ссылки на курсорные переменные?
Elic
Дата: 05.12.2007 17:41:04
срочновномер
правильно ли я понимаю, что Оракл (9i и 10g) не умеет передавать ссылки на курсорные переменные?
Полный бардак :)
RTFM Using Cursor Variables (FAQ)
срочновномер
Дата: 05.12.2007 17:58:46
RTFM хорош к месту, зачем вырывать вопрос из контекста?
Brodiaga
Дата: 05.12.2007 18:01:59
Здесь он как раз к месту
Полночный
Дата: 05.12.2007 18:09:32
срочновномер
RTFM хорош к месту, зачем вырывать вопрос из контекста?

RTFM потому, что Ваш x - не курсорная переменная. Хотите REF CURSOR - декларируйте REF CURSOR, а то, что Вы назвали "неявным ref cursor" на самом деле "неявный record".
срочновномер
Дата: 05.12.2007 18:22:56
Полночный
срочновномер
RTFM хорош к месту, зачем вырывать вопрос из контекста?

RTFM потому, что Ваш x - не курсорная переменная. Хотите REF CURSOR - декларируйте REF CURSOR, а то, что Вы назвали "неявным ref cursor" на самом деле "неявный record".


ок, не буду спорить, сформулировано неточно.
Переформулирую: можно ли передавать "неявный рекорд"
Elic
Дата: 05.12.2007 18:37:06
срочновномер
Переформулирую: можно ли передавать "неявный рекорд"
cursor%rowtype устроит?
срочновномер
Дата: 05.12.2007 19:21:56
Elic
срочновномер
Переформулирую: можно ли передавать "неявный рекорд"
cursor%rowtype устроит?


выносить локальный курсор в глоб. секцию тоже не фонтан, конечно.. но как вариант.
tnx!
Полночный
Дата: 05.12.2007 19:24:59
срочновномер
ок, не буду спорить, сформулировано неточно.
Переформулирую: можно ли передавать "неявный рекорд"

Формальный параметр процедуры не может быть "неявного типа". Декларируйте курсор и используйте либо %ROWTYPE (это будет правильнее всего), либо, если вызываемая процедура определена вне области видимости курсора, декларируйте возвращаемый курсором набор:
Присоединен к:
Oracle8i Enterprise Edition Release 8.1.7.4.1 - Production
With the Partitioning option
JServer Release 8.1.7.4.1 - Production

SQL> set serveroutput on
SQL> DECLARE
  2    TYPE Explicit$Rec IS RECORD (
  3        a NUMBER
  4      , b VARCHAR2 (10)
  5      , c DATE
  6    );
  7  
  8  
  9    PROCEDURE callee (p_Explicit Explicit$Rec)
 10    IS
 11    BEGIN
 12      DBMS_Output.put_Line ('a = ' || p_Explicit.a);
 13      DBMS_Output.put_Line ('b = ' || p_Explicit.b);
 14      DBMS_Output.put_Line ('c = ' || p_Explicit.c);
 15    END callee;
 16  
 17    PROCEDURE caller
 18    IS
 19      CURSOR Cur RETURN Explicit$Rec IS
 20        SELECT 10, 'asd', sysdate
 21         FROM Dual;
 22    BEGIN
 23      FOR v_Implicit IN Cur LOOP
 24        callee (v_Implicit);
 25      END LOOP;
 26    END;
 27  BEGIN
 28    caller ();
 29  END;
 30  /
a = 10
b = asd
c = 05.12.07

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