블로그 이미지
신세계 SSG.COM / IT개발 1팀 / 상품개발담당 / 김지영 FreeEnd

카테고리

전체 (81)
끄적끄적 (13)
News (1)
Movie (11)
Security (1)
Design Patterns (2)
Operating System (4)
Database (8)
Framework (4)
Solution (7)
Language (1)
Web (4)
Lib (3)
TEST_Tools (4)
ETC... (7)
Software Factory (0)
Total193,486
Today40
Yesterday41


달력

« » 2017.08
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

공지사항

글 보관함

CURSOR 란?

Database/Oracle / 2010.10.02 14:07

 
 CURSOR 란?

 오라클에서 CURSOR란 시스템 글로벌 영역의 공유 풀 내에 저장공간을 사용하여 사용자가 SQL 문을 실행시키면 결과값을 저장공간에 가지고 있다가 원하는 시기에 순차적으로 fetch해 처리하여 해당 결과 셋을 프로그래밍적으로 접근할수 있게 도와주는 기능이다.

 이해를 돕기위해 아래의 명시적 커서 예문을 보자.
 하단의 선언문(DECLARE)에서 SELECT한 결과값을 실행문(BEGIN)에서 FETCH 하여 한 결과값을 순차적으로 처리할 수 있다. 뭐 이해가 안가도 그냥 보자.


열심히 그렸다. 참견 말자.


CURSOR는 묵시적커서(Implicit Cursor)와 명시적커서(Explicit Curosr)로 나뉜다.



묵시적 커서 (Implicit Cursor)

 묵시적 커서는 각 SQL문장의 실행 결과에 접근하여 그 결과값을 이용하기 위한 내부적 커서이다. 간단히 변수를 이용한다고 생각해도 좋겠다. 일반적으로 SELECT문, 혹은 다른 속성에서 값을 얻어와 변수에 저장하는데 사용된다.

예문)
SELECT name
          into v_name
 FROM members
 WHERE student_no = 13;
 v_count = SQL%ROWCOUNT;

상단의 예문의 빨간 부분은 모두 묵시적 커서가 사용된 문장이다. 예문 내에는 커서가 선언된 부분이 없지만 v_name변수로 해당 SELECT문의 결과값이 (당연히 저 SELECT문의 결과는 1개여야 한다. 그 이상일 경우 에라.) 저장된다. 또 하단의 SQL%ROWCOUNT의 값이 v_count변수에 할당된다. 물론 SELECT문에서 나온 행수는 1개이므로 v_count에는 1이 들어간다.


묵시적 커서에서는 위에 사용된 SQL%ROWCOUNT와 같이 4가지 속성을 제공한다.

SQL%ROWCOUNT : 최근 실행된 SQL문의 결과 행 갯수를 리턴
SQL%FOUND : 최근에 실행된 SQL문의 결과 행 존재 유무, 결과값이 있을때 TRUE를 리턴.
SQL%NOTFOUND : SQL%FOUND와 반대
SQL%ISOPEN : 최근에 실행된 SQL문의 묵시적 커서의 종료 유무





명시적 커서 (Explicit Cursor)

 명시적 커서는 처음의 맨 상단의 예제와 같이 일반적으로 어떠한 결과값을 글로벌 영역에 저장해놓고 순차적으로 값을 Fetch해 이용하기 위해 사용된다. 명시적 커서라고 불리우는 이유는 묵시적 커서와는 다르게 명시적으로 CURSOR라고 선언하고 사용하기 때문에 누가봐도 커서니깐. 그렇게 불린다. 머. 아님말고.

 명시적 커서는 간단히 아래와 같이 4단계로 나뉜다.

 CURSOR :  커서 선언
 OPEN : 커서 열기
 FETCH ~ INTO : 커서가 가리키는 곳의 결과 값을 엑세스
 CLOSE : 커서 닫기


 다시 한번 상단의 그림으로 한단계씩 살펴보자.



1) DECLARE 
    CURSOR cursor_name IS 
    sql_statement;
커서를 선언하고 커서 선언문 내에 선언된 sql_statment를 실행하여 해당 결과값을 시스템 글로벌영역에 결과 값을 저장한다.



2) BEGIN
    OPEN cursor_name;
해당 커서 내음의 작업을 위해 커서 영역을 오픈한다.
이때 선언문에서 선언한 sql_statement를 실행해 해당 결과값을 구성한뒤 커서는 해당 결과값의 첫번째 행에 커서를 위치 시킨다.


3) FETCH cursor_name INTO variable1, variable2, ...;

cursor_name의 커서를 순차적으로 FETCH한다. 이때 cursor_name의 SELECT 문에 있는 컬럼 갯수와 variables의 갯수가 값아야 한다. 그 순서대로 variables에 값이 할당된다.



4) CLOSE cursor_name;

현재 오픈되어 있는 커서를 닫는다.



상단의 예에서 보듯이 CURSOR는 루프 문이 아니다. JAVA에서의 VECTOR등의 같이 결과값을 하나씩 순차적으로 FETCH할때만 사용된다. 적절히 사용하기 위해서는 LOOP문과 같이 사용하면 된다.




이상으로 간단하게 오라클의 CURSOR에 대하여 알아보았다. 많이 쓰이는 예이니 다들 꼭 기억해 두길 바란다. 지영옹.
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영옹 FreeEnd

티스토리 툴바