커서 표현식

    커서 표현식은 SELECT 문에서 컬럼 형태로 커서를 사용하는 것을 말한다. 아래의 문장을 보자.

    입력

        SELECT ( SELECT department_name
                   FROM departments d
                  WHERE e.department_id = d.department_id) AS dep_name,
               e.emp_name
          FROM employees e
         WHERE e.department_id = 90;
    

    결과

        DEP_NAME      EMP_NAME
        ------------- -----------------------
        기획부        Steven King
        기획부        Neena Kochhar
        기획부        Lex De Haan
    

    90번 부서의 명칭과 해당 사원 이름을 출력하였다. 그럼 위 쿼리를 이렇게 바꾸면 어떨까?

    입력

        SELECT d.department_name,
                ( 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;
    

    결과

        SQL 오류: ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.
    

    오류가 나는 것은 당연하다. SELECT 리스트에서 컬럼용으로 서브 쿼리를 사용할 때 반드시 반환되는 로우는 한 개여야 하는데 90번 부서에 속한 사원이 3명이므로 오류가 난 것이다. 따라서 이전 쿼리처럼 결과를 출력하려면 사원과 부서 테이블을 조인해야 한다.

    그런데 커서 표현식을 사용하면 위 문장 형태와 비슷한 구문을 사용할 수 있고, 게다가 반환되는 로우 개수는 1개 뿐이다. 커서 표현식 사용법은 한 가지만 제외하고 서브 쿼리 구문과 비슷하다.

        CURSOR (서브 쿼리)
    

    그럼 위 문장에서 서브 쿼리 대신 커서 표현식을 넣어보자.

    입력

        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;
    

    사용하는 툴마다 위 쿼리 결과로 반환되는 형태가 각기 다르지만, 반환되는 로우는 한 개 뿐이다. 왜냐하면 부서 테이블에서 90번 부서는 한 개만 있기 때문이다. 다만 커서 표현식을 사용한 두 번째 컬럼은 로우는 한 개지만 내부적으로 3개의 데이터를 담고 있다(어떤 형태로 결과가 나오는지는 직접 다양한 툴에서 실행해 보고 확인하자).

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