더북(TheBook)

커서 표현식

커서 표현식은 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개의 데이터를 담고 있다(어떤 형태로 결과가 나오는지는 직접 다양한 툴에서 실행해 보고 확인하자).

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