Нужна ли клауза RETURN при объявлении явного курсора?

Есть такой код:

CURSOR emp_cur RETURN employees%ROWTYPE
 IS
 SELECT * FROM employees
 WHERE department_id = 10;

Объясните, пожалуйста, зачем здесь нужен клауза RETURN?
Нужно ли затем передавать курсор в переменную, например: ins_c emp_cur%ROWTYPE;?


Ответы (1 шт):

Автор решения: 0xdb

Нужно ли затем передавать курсор в переменную ins_c emp_cur%ROWTYPE;

Нет, не обязательно, можно и в переменную другого типа, но колличество полей и их тип (как минимум совместимый тип) должны совпадать с сетом результата курсора.

create table employees (id int primary key, name varchar2 (32), department_id int)
/
declare
    CURSOR emp_cur RETURN employees%ROWTYPE IS
        SELECT * FROM employees
        WHERE department_id = 10;
    type emprec is record (id int, name varchar2 (32), department_id varchar2 (8));
    emp emprec;
begin 
    open emp_cur;
    fetch emp_cur into emp; 
end;
/
PL/SQL procedure successfully completed.

Клауза RETURN нужна только при декларации курсора. При определении курсора эта клауза не обязательна, т.е, опциональна.

Явный курсор всегда "строгий", то есть, тип результата курсора должен быть известен на этапе компиляции, или из клаузы RETURN при декларации, или из статического запроса при определении курсора. Поэтому, при определени курсора клауза RETURN или может быть опущена, или она должна совпадать с декларацией:

declare
    type emprec is record (id int, name varchar2 (32), department_id int);
    CURSOR emp_cur RETURN emprec; --декларация
    CURSOR emp_cur RETURN employees%ROWTYPE IS --определение
        SELECT * FROM employees
        WHERE department_id = 10;
    emp emprec;
begin null;
    open emp_cur;
end;
/

PLS-00307: too many declarations of 'EMP_CUR' match this call

→ Ссылка