SELECT문 처리 결과(RESULT SET)를 담고 있는 메모리 공간에 대한 포인터(참조)
커서 사용 시 복수행의 처리 결과에 한 행씩 순차적으로 접근 가능
🔎 RESULT SET이 단일행일 경우 INTO절을 이용해 변수에 결과를 저장할 수 있지만,
복수행일 경우에는 INTO절을 이용하여 처리할 수 없다.
이때, 복수행의 결과를 CURSOR를 이용해 행 단위로 처리할 수 있다.
오라클에서 PL/SQL 블록의 SQL문이 실행될 때마다 자동으로 생성되어 사용되는 커서
사용자는 생성 유무를 알 수 없지만, 커서의 속성을 이용하여 커서의 정보를 얻어올 수 있음
(묵시적 커서의 정보 참조 시 커서명 : SQL
)
%ROWCOUNT
: SQL문 처리 결과로 얻어온 ROW 수 (0부터 시작, FETCH마다 1 증가)%FOUND
: 커서 영역의 ROW 수가 1개 이상이면 TRUE, 1개 미만이면 FALSE%NOTFOUND
: 커서 영역의 ROW 수가 1개 미만이면 TRUE, 1개 이상이면 FALSE%ISOPEN
: 커서가 OPEN 상태이면 TRUE (묵시적 커서는 항상 FALSE)사용자가 직접 선언하여 사용할 수 있는 커서
CURSOR
: 커서 선언OPEN
: 커서 열기FETCH
-- 데이터 추출CLOSE
-- 커서 닫기▪ 나이가 20살 이상인 학생의 학번, 이름, 나이를 출력
DECLARE -- 선언부
-- 커서 선언
CURSOR C_TEST IS
SELECT ST_ID, ST_NAME, ST_AGE FROM STUDENT
WHERE AGE >= 20;
-- 변수 선언
ID STUDENT.ST_ID%TYPE;
NAME STUDENT.ST_NAME%TYPE;
AGE STUDENT.ST_AGE%TYPE;
BEGIN -- 실행부
OPEN C_TEST; -- 커서 열기
-- 반복문 활용
-- 주의 : 무한 반복에 대한 종료 조건 필요!
LOOP
FETCH C_TEST INTO ID, NAME, AGE; -- 데이터 추출 후 변수에 결과 값 저장
EXIT WHEN C_TEST%NOTFOUND; -- 종료 조건
DBMS_OUTPUT.PUT_LINE(ID || ' / ' || NAME || ' / ' || AGE);
END LOOP;
CLOSE C_TEST; -- 커서 닫기
END;
/
🔎 FOR문을 이용한 커서에서는 OPEN, FETCH, CLOSE가 자동으로 이루어진다!
DECLARE
CURSOR C_TEST IS
SELECT ST_ID, ST_NAME, ST_AGE FROM STUDENT
WHERE AGE >= 20;
STU STUDENT%ROWTYPE;
BEGIN
FOR STU IN C_TEST
LOOP
DBMS_OUTPUT.PUT_LINE(
STU.ST_ID || ' / ' || STU.ST_NAME || ' / ' || STU.ST_AGE);
END LOOP;
END;
/