1. 개념설명

커서 (Cursor)는 컴퓨터로 문서를 작성해 본 사람이라면 누구나 알고 있는 용어이다. 화면에서 현재 사용자의 위치를 나타내며 깜빡거리는 막대기가 바로 커서이다.

데이터베이스에서의 커서 또한 유사한 개념이다. 방대한 양의 데이터에서 특정 위치, 특정 로우(row)를 가리킬때 커서가 사용된다. 위키피디아에서는 커서에 대해 '많은 로우 중 한 로우를 가리키는 포인터와 같다'고 설명하고 있다. 

즉 커서란 현재 작업중인 레코드를 가리키는 오브젝트이다. 



2. 오라클

오라클의 경우 커서를 시적 커서(Implicit Cursor)와 명시적 커서(Explicit Cursor)로 분류한다. 

묵시적 커서는 오라클에서 SQL문장이 처리되는 위치를 가리키는 주소이며, 실행되는 모든 SQL 문장에 대해서 자동적으로 생성된다. 예를 들어 SELECT구문으로 데이터를 검색했을 때, 묵시적 커서가 생성되어 현재 검색중인 레코드를 가리키고 있게 된다. 

명시적 커서는 묵시적 커서가 생성되는 부분, 예를 들어 PL/SQL 구문에 프로그래머가 커서의 이름 등 속성을 명시할 경우 생성된다. 명시적으로 커서를 생성했을 경우 프로그래머가 커서에 직접 접근할 수 있으며, 이를 통해 쿼리의 각 로우를 개별적으로 처리할 수 있는 등의 장점이 있다. 하지만 커서 선언문을 처리해야 하므로 처리 속도는 묵시적 커서에 비해 느리다.

작업이 끝난 후에도 커서가 계속해서 작동하면서 메모리를 사용할 수 있으니, 커서를 닫는(Close) 것을 잊지 말자.



3. MSSQL

MSSQL의 경우 커서는 정적 커서(Static Cursor), 동적 커서(Dynamic Cursor), 키 집합 커서(Keyset-Driven Cursor), 정방향 전용 커서(Forward-Only Cursor)로 나뉜다

정적 커서는 읽기 전용인 커서로, tempdb에 쿼리 결과의 전체 집합을 복사해서 저장해 나타낸다. 커서가 열린 뒤 쿼리 결과에 변화가 생겨도 정적 커서에는 반영되지 않는다. 

동적 커서는 정적 커서의 반대 개념으로, 커서를 통해 스크롤을 이동할 때 변경된 로우가 있으면 커서에 반영된다. 

정방향 전용 커서는 쿼리의 처음부터 끝까지 한 방향으로만 움직인다. 스크롤을 올릴 수 없기 때문에 커서를 통해 로우가 인출된 뒤 데이터베이스에 변화가 생겨도 대부분 커서에 나타나지 않는다. 빠른 정방향 전용 커서(FAST_FORWARD Cursor)는 커서 중 가장 속도가 빠르다.

키 집합 커서는 정적 커서와 동적 커서의 혼합된 형태라고 할 수 있다. 키 집합 커서는 쿼리 결과 전체에 대한 '키'를 tempdb에 저장하여, 스크롤을 이동할 때 '키'를 통해 각 로우에 대한 실시간 데이터를 받아온다. 따라서 동적 커서와 마찬가지로 로우 값의 변경 내역이 커서에 반영된다. 하지만 로우 자체가 삭제되거나 키 값이 업데이트되었을 경우 변경 이후의 내용은 결과에 나타나지 않는다. 또한 외부에서 입력된 로우의 경우 키 값이 존재하지 않으므로 커서에 반영되지 못한다.



AND