명시적 커서
자, 본격적으로 사용자가 직접 정의해서 사용할 수 있는 명시적 커서에 대해 살펴 보자. 명시적 커서를 사용하기 위해서는 “커서 선언 - 커서 열기 - 패치 단계에서 커서 사용 - 커서 닫기”, 4단계 작업이 필요하다. 각 단계별 구문을 살펴 보자.
1단계: 커서 선언
묵시적 커서와 달리 명시적 커서는 사용할 커서를 선언부에 직접 정의해야 한다. 즉 사용할 커서에 이름을 부여하고 이 커서에 대한 쿼리를 선언해야 한다. 명시적 커서란 것이 결과 데이터 집합을 로우별로 참조해서 무언가 작업을 하기 위한 용도이므로 당연히 커서를 정의해 사용하는 문장은 SELECT문이다. 커서의 선언 형태는 다음과 같다.
CURSOR 커서명[(매개변수1, 매개변수2, ...)]
IS
SELECT 문장;
커서명은 사용자가 직접 정의하고 매개변수는 생략이 가능한데, 매개변수를 명시할 때 이들은 SELECT 문장의 WHERE 절에서 조건을 체크하는 변수로 사용된다.
2단계: 커서 열기
커서를 선언한 뒤 해당 커서를 사용하려면 먼저 커서를 열어야 한다.
OPEN 커서명 [(매개변수1, 매개변수2,...)];
3단계: 패치 단계에서 커서 사용
정의한 커서를 열고 난 후에야 SELECT문의 결과로 반환되는 로우에 접근할 수 있다. 결과 집합의 로우 수는 보통 1개 이상이므로 개별 로우에 접근하기 위해서는 9장에서 학습했던 반복문을 사용해야 하는데, LOOP, WHILE, FOR 문에서 모두 사용 가능하다. 예를 들어 LOOP문에서는 다음과 같이 사용한다.
LOOP
FETCH 커서명 INTO 변수1, 변수2,...;
EXIT WHEN 커서명%NOTFOUND;
END LOOP;
FETCH…INTO를 통해 커서에서 반환되는 각 컬럼 값을 변수에 할당할 수 있다. 이때, 변수는 반환된 컬럼 수와 타입이 일치해야 한다. 즉 커서를 선언할 때 연결했던 SELECT 문의 컬럼 수만큼 변수를 명시해야 하고 타입도 맞춰 줘야 한다. 또한 반복문을 사용하므로 해당 커서의 참조가 모두 끝났을 때 반복문을 빠져나와야 하는데, 이때 ‘커서명%NOTFOUND’ 커서 속성을 사용해서 루프를 벗어난다. 묵시적 커서와 달리 명시적 커서는 S‘QL%’ 대신 선언했던 ‘커서명%’ 형태로 속성을 참조한다.