Полагаю, вы имеете в виду Ref Cursor.Это конструкция PL / SQL, которая действует как указатель на набор записей, возвращаемых запросом.Это означает, что он должен быть интерпретирован клиентом, который выполняет запрос.Например, мы можем сопоставить Ref Cursor с JDBC или ODBC ResultSet.
Нет ничего плохого в вашем базовом утверждении.Вот функция, похожая на вашу:
SQL> desc get_emps
FUNCTION get_emps RETURNS REF CURSOR
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
P_DNO NUMBER(2) IN
P_SORT_COL VARCHAR2 IN DEFAULT
P_ASC_DESC VARCHAR2 IN DEFAULT
SQL>
Я могу легко вызвать это в более широком блоке PL / SQL:
SQL> declare
2 rc sys_refcursor;
3 begin
4 rc := get_emps(50);
5 end;
6 /
PL/SQL procedure successfully completed.
SQL>
Однако SQL * PLus может обрабатывать конструкции CURSOR изначально:
SQL> select get_emps(50) from dual
2 /
GET_EMPS(50)
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
8060 VERREYNNE PLUMBER 8061 08-APR-08 4000 50
8061 FEUERSTEIN PLUMBER 7839 27-FEB-10 4500 50
8085 TRICHLER PLUMBER 8061 08-APR-10 3500 50
8100 PODER PLUMBER 8061 3750 50
SQL>
Этот оператор также выполняется в SQL Developer, хотя набор результатов представлен в виде некрасиво .
Итак, если у вас возникли проблемы сВаша функция, вопросы:
- Какую клиентскую среду вы используете?
- Каким точным образом это "не работает"?Пожалуйста, опишите наблюдаемое поведение, включая сообщения об ошибках?
- Также сообщите нам подробности среды, такие как версия базы данных, ОС и т. Д.
Прочитав ваш другой вопрос по этой теме, я подумал, что проблема может бытьиз-за использования пользовательского Ref Cursor (а не встроенного).Однако это не имеет никакого значения.Эта упакованная функция:
SQL> create or replace package emp_rc_utils as
2
3 type emp_rc is ref cursor return emp%rowtype;
4
5 function get_emps
6 ( p_dno in emp.deptno%type
7 )
8 return emp_rc;
9 end;
10 /
Package created.
SQL> create or replace package body emp_rc_utils as
2
3 function get_emps
4 ( p_dno in emp.deptno%type
5 )
6 return emp_rc
7 is
8 return_value emp_rc_utils.emp_rc;
9 begin
10
11 open return_value for select * from emp where deptno = p_dno;
12
13 return return_value;
14 end get_emps;
15
16 end emp_rc_utils;
17 /
Package body created.
SQL>
Все еще работает ...
SQL> declare
2 rc sys_refcursor;
3 begin
4 rc := emp_rc_utils.get_emps(50);
5 end;
6 /
PL/SQL procedure successfully completed.
SQL> select emp_rc_utils.get_emps(50) from dual
2 /
EMP_RC_UTILS.GET_EMP
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
8085 TRICHLER PLUMBER 8061 08-APR-10 3500 50
8060 VERREYNNE PLUMBER 8061 08-APR-08 4000 50
8061 FEUERSTEIN PLUMBER 7839 27-FEB-10 4500 50
8100 PODER PLUMBER 8061 3750 50
SQL>