Cursor란
SQL문장을 처리한 결과를 가지고 있는 메모리 영역을 가리키는 포인터이다.
암시적커서와 명시적커서로 구분된다.
암시적커서
오라클에서 실행되는 모든 SQL문장은 암시적커서가 생성된다. (자동으로 생성)
암시적커서 속성
- SQL%FOUND : 해당 SQL문에 의해 반환된 행의 수가 1개 이상이면 TRUE
- SQL%NOTFOUND : 해당 SQL문에 의해 반환된 행의 수가 없을 경우 TRUE
- SQL%ISOPEN : 커서가 OPEN 되어 있는지 여부인데, 암시적커서는 FALSE이다.
암시적 커서는 자동으로 OPEN ~ Close 된다. - SQL%ROWCOUNT : SQL문에 의해 반환된 총 행수 or 영향을 받은 행의 개수(UPDATE, INSERT, DELETE)
명시적커서
사용자가 직접 정의해서 사용하는 이름이 있는 커서
사용자가 커서의 OPEN, FETCH, CLOSE 등을 제어한다.
조회한 커서는 FETCH문을 사용하여 하나씩 행을 읽을 수 있고, 사용이 끝나면 커서를 닫아 리소스를 반환해야
한다.
명시적커서 속성
cursor_name%FOUND : FETCH 한 데이터가 행을 반환하면 TRUE
cursor_name%NOTFOUND : FETCH 한 데이터가 행을 반환하지 않으면 TRUE(보통 LOOP를 끝낼 때 사용한다.)
cursor_name%ISOPEN : 커서가 OPEN 되어 있으면 TRUE
cursor_name%ROWCOUNT : 현재까지 반환된 총 행수
커서 사용법
커서사용 순서
- 커서 선언
명시적커서 선언 : CURSOR cursur_name IS SELECT문
암시적커서 선언 : 암시적커서는 개발자가 직접 선언하지 않으며 SQL문장 실행 시 자동으로 생성 - 커서오픈
명시적커서 오픈 : OPEN cursur_name;
암시적커서 오픈 : 암시적커서는 자동으로 오픈 - 커서로부터 데이터 읽기
FETCH 커서명 INTO value1, value2; - 커서닫기
명시적커서 닫기 : CLOSE 커서명;
암시적커서 닫기 : 자동으로 닫힌다.
가장 많이 사용하는 방법으로는 FOR LOOP문과 커서의 조합이다.
#1 LOOP문
1
2
3
4
5
6
7
8
9
10
11
|
DECLARE
CURSOR cursor_name IS SELECT 문;
BEGIN
OPEN cursur_name;
FETCH cursur_name INTO 변수
(BODY)
EXIT WHEN cursur_name%NOTFOUND;
END LOOP;
CLOSE cursur_name;
END;
|
cs |
#2 FOR문
1
2
3
4
5
6
7
8
9
|
DECLARE
CURSOR cursur_name IS SELECT 문;
BEGIN
FOR 변수 IN cursur_name
(BODY)
EXIT WHEN cursur_name%NOTFOUND;
END LOOP;
END;
|
cs |
#3 FOR문2
1
2
3
4
5
6
7
|
BEGIN
FOR 변수 IN SELECT 문
LOOP
(BODY)
END LOOP;
END;
|
cs |
명시적커서를 사용할 때는 OPEN과 CLOSE를 반드시 해줘야 하지만
FOR문에서는 자동으로 OPEN과 CLOSE, 행이 없을 때까지 FETCH 해주기 때문에 따로 작성하지 않아도 된다.
이상으로 ORACLE에서 사용하는 CURSOR에 대해서 정리해 봤다.