이번에는 커서 표현식을 사용한 위 쿼리를 익명 블록에서 실행해 결과를 출력해 보자.
입력
DECLARE
-- 커서 표현식을 사용한 명시적 커서 선언
CURSOR mytest_cursor IS
SELECT d.department_name,
CURSOR ( SELECT e.emp_name
FROM employees e
WHERE e.department_id = d.department_id) AS emp_name
FROM departments d
WHERE d.department_id = 90;
-- 부서명을 받아오기 위한 변수
vs_department_name departments.department_name%TYPE;
--커서 표현식 결과를 받기 위한 커서 타입 변수
c_emp_name SYS_REFCURSOR;
-- 사원명을 받는 변수
vs_emp_name employees.emp_name%TYPE;
BEGIN
-- 커서오픈
OPEN mytest_cursor;
-- 명시적 커서를 받아 오는 첫 번째 LOOP
LOOP
-- 부서명은 변수, 사원명 결과 집합은 커서 변수에 패치
FETCH mytest_cursor INTO vs_department_name, c_emp_name;
EXIT WHEN mytest_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ('부서명 : ' || vs_department_name);
-- 사원명(커서 표현식)을 출력하기 위한 두 번째 LOOP
LOOP
-- 사원명 패치
FETCH c_emp_name INTO vs_emp_name;
EXIT WHEN c_emp_name%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(' 사원명 : ' || vs_emp_name);
END LOOP; -- 두 번째 LOOP 종료
END LOOP; -- 첫 번째 LOOP 종료
END;
결과
부서명 : 기획부
사원명 : Steven King
사원명 : Neena Kochhar
사원명 : Lex De Haan
앞의 소스코드에서 커서 표현식이 반환하는 결과 집합도 커서 형태이므로 이를 위해 LOOP문을 두 번 사용했다는 점만 주의한다면 그리 어려운 점은 없을 것이다. 즉 명시적 커서에 대한 LOOP문 한 개와 커서표현식이 반환한 결과에 대한 LOOP 한 개를 중첩해서 사용한 것이다. 경험상 커서 표현식을 사용할 일은 그리 많이 보지 못했지만, 이런 식으로도 테이블에서 데이터를 추출해 낼 수 있다는 점을 기억해 두자.