더북(TheBook)

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

입력

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

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