이번에는 커서 표현식을 사용한 위 쿼리를 익명 블록에서 실행해 결과를 출력해 보자.

    입력

        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 한 개를 중첩해서 사용한 것이다. 경험상 커서 표현식을 사용할 일은 그리 많이 보지 못했지만, 이런 식으로도 테이블에서 데이터를 추출해 낼 수 있다는 점을 기억해 두자.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.