Хорошо, вот пример процедуры, функции и анонимного блока, которые возвращают ref-курсоры в sqlplus:
ops$tkyte@ORA817DEV.US.ORACLE.COM> create or replace package types
2 as
3 type rc is ref cursor;
4 end;
5 /
Пакет создан.
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM> create or replace procedure get_cursor_proc( p_cursor in out types.rc )
2 is
3 begin
4 open p_cursor for select * from dual;
5 end;
6 /
Процедура создана.
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM> create or replace function get_cursor_func return types.rc
2 as
3 l_cursor types.rc;
4 begin
5 open l_cursor for select * from dual;
6 return l_cursor;
7 end;
8 /
Функция создана.
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM> variable x refcursor
ops$tkyte@ORA817DEV.US.ORACLE.COM> set autoprint on
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM> REM procedure
ops$tkyte@ORA817DEV.US.ORACLE.COM> exec get_cursor_proc(:x)
Процедура PL / SQL успешно завершена.
D
X
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM> REM function
ops$tkyte@ORA817DEV.US.ORACLE.COM> exec :x := get_cursor_func
PLПроцедура / SQL успешно завершена.
D
X
ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM> REM anonymous block
ops$tkyte@ORA817DEV.US.ORACLE.COM> begin
2 open :x for select * from dual;
3 end;
4 /
Процедура PL / SQL успешно завершена.
D
X