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