В тексте, который вы цитируете из руководства, обратите внимание, что в нем конкретно говорится о «подпрограмме , извлекаемой из переменной курсора ».Ни один из ваших примеров не делает этого, поэтому цитата к ним не относится.
Однако, тем не менее, кажется, что нет ничего плохого в использовании OUT
только в такой ситуации, если подпрограмма и открывается, и выбираетпеременная курсора:
SQL> variable c refcursor
SQL> set serveroutput on
SQL> create or replace procedure no_good (c OUT sys_refcursor)
2 as
3 my_dummy dual.dummy%type;
4 begin
5 open c for select dummy from dual union all select dummy from dual;
6 fetch c into my_dummy;
7 dbms_output.put_line( my_dummy );
8 end;
9 /
Procedure created.
SQL> exec no_good( :c )
X
PL/SQL procedure successfully completed.
SQL> print c
D
-
X
Я думаю, что текст на самом деле пытается сделать две точки, которые несколько независимы друг от друга.Во-первых, если вы хотите передать какую-либо уже открытую переменную курсора в подпрограмму, которая будет извлекать ее, параметр должен быть объявлен IN
или IN OUT
.Во-вторых, если вы хотите передать переменную курсора в подпрограмму, которая затем откроет ее, параметр должен быть объявлен OUT
или IN OUT
.Это верно независимо от того, действительно ли вы заботитесь о передаче значения переменной курсора обратно вызывающей стороне:
SQL> create or replace procedure no_good (c IN sys_refcursor)
2 as
3 my_dummy dual.dummy%type;
4 begin
5 open c for select dummy from dual;
6 fetch c into my_dummy;
7 dbms_output.put_line( my_dummy );
8 close c;
9 end;
10 /
Warning: Procedure created with compilation errors.
SQL> show error
Errors for PROCEDURE NO_GOOD:
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/6 PL/SQL: SQL Statement ignored
5/11 PLS-00361: IN cursor 'C' cannot be OPEN'ed
Эта ошибка может быть исправлена путем изменения режима параметра, но на самом деле это может привести ксмысл просто сделать переменную курсора локальной переменной, а не параметром.