Функция создания возвращает sys_refcursor - PullRequest
0 голосов
/ 21 февраля 2019

Как создать функцию для отображения всех сотрудников одного отдела?Я пробовал этот код, но он возвращает только значение курсора.

CREATE OR REPLACE FUNCTION emp_dept (dept_id IN NUMBER)
RETURN SYS_REFCURSOR
IS 
emp_name SYS_REFCURSOR;

BEGIN
OPEN emp_name
FOR SELECT last_name
     FROM employees
    WHERE department_id = dept_id;

RETURN emp_name;
END emp_dept;

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете использовать эти опции для чтения и отображения вывода из курсора, который возвращается из вашей функции.

Использование простого выбора

select emp_dept(10) from dual;

Результат

EMP_DEPT(10)        
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

LAST_NAME                
-------------------------
Whalen

Использование DBMS_SQL.RETURN_RESULT (Oracle 12c и выше)

DECLARE
l_cur SYS_REFCURSOR := emp_dept(10) ;
BEGIN
   DBMS_SQL.RETURN_RESULt(l_cur);
END;
/

Результат

PL/SQL procedure successfully completed.

ResultSet #1


LAST_NAME                
-------------------------
Whalen

FETCH из курсора в локальную коллекцию.Небольшое отклонение может также использоваться для извлечения в скалярную переменную.

DECLARE
l_cur SYS_REFCURSOR := emp_dept(10) ;
TYPE l_last_name_tab IS TABLE OF employees.last_name%TYPE;
l_lnt l_last_name_tab;
BEGIN
   FETCH l_cur BULK COLLECT INTO l_lnt;

   for i in 1..l_lnt.count
   loop
    dbms_output.put_line(l_lnt(i));
   end loop;
END;
/

Результат

Whalen


PL/SQL procedure successfully completed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...