반응형

커서의 옵션

STATIC / DYNAMIC / KEYSET 에 대해 알아보면

STATIC(정적) 은 원본 DB에 대한 데이터를 모두 복사하는 것.
 그러므로 원본 DB의 변경 및 삽입은 커서에 반영되지 않으며
DYNAMIC(동적) 은 원본 DB에 대한 현재 커서 포인트의 키 값만 복사하는 것.
 그러므로 원본 DB가 변경되거나 삽입된 정보를 커서에서도 확인가능하며
KEYSET(키집합) 은 원본 DB에 대한 키 값만 모두 복사하는 것. 
 그러므로 원본 DB가 변경되는 것은 커서에서도 확인 가능하지만 새로운 열이 삽입되는 것은 알 수가 없다.


DECLARE cursorTbl_cursor CURSOR
    FOR SELECT str1 FROM cursorTbl;

DECLARE @result CURSOR
EXEC sp_describe_cursor @cursor_return = @result OUTPUT,
    @cursor_source = N'GLOBAL'
    @cursor_identity = N'cursorTbl_cursor'

FETCH NEXT FROM @result
WHILE (@@FETCH_STATUS <> -1)
    FETCH NEXT FROM @result

실행하면 model필드의 값이 3으로 설정된 것이 보일 것이다.
1 : STATIC
2 : KEYSET
3 : DYNAMIC
4 : FAST_FORWARD

DEFAULT 시 DYNAMIC

concurrency 필드의 값은
1 : READ_ONLY (읽기 전용)
2 : SCROLL_LOCKS(스크롤잠금)
3 : OPTIMISTIC(낙관적)

STATUS 
-1 : 커서가 열리지 않은 상태

DEALLOCATE cursorTbl_cursor  커서 해제한다.




예외적으로 

CREATE TABLE keysetTbl (id INT, txt CHAR(5));
INSERT INTO keysetTbl VALUES (1, 'AAA');
INSERT INTO keysetTbl VALUES (2, 'BBB');
INSERT INTO keysetTbl VALUES (3, 'CCC');

DECLARE keysetTbl_cursor CURSOR GLOBAL FORWARD_ONLY KEYSET
FOR SELECT id, txt FROM keysetTbl;

DECLARE @result CURSOR
EXEC sp_describe_cursor @cursor_return = @result OUTPUT,
@cursor_source = N'GLOBAL', @cursor_identity = N'keysetTbl_cursor'

FETCH NEXT FROM @result
WHILE (@@FETCH_STATUS <> -1)
FETCH NEXT FROM @result


KEYSET으로 설정했음에도 model 필드의 값은 1(STATIC)이다.
이것은 keysetTbl에 고유 인덱스가 없기 때문에 암시적인 커서 변환이 일어나서 KEYSET이 STATIC으로 변환된 것이다.

이럴때는 
DECLARE keysetTbl_cursor CURSOR GLOBAL FORWARD_ONLY KEYSET TYPE_WARNING
    FOR SELECT id, txt FROM keysetTbl;
을 사용하면 정상적으로 나온다.

-뇌를 자극하는 SQL2008 중에서..







반응형

'연구개발 > SQL2008' 카테고리의 다른 글

인덱스 정보 조회  (0) 2010.04.22
FullText Search 시에 가중치 주기  (0) 2010.04.22
DatePart 주차  (0) 2010.04.19
인덱스.. 클러스터 인덱스 와 넌클러스터 인덱스  (0) 2010.04.15
테이블 정보 프로시저  (0) 2010.04.15

+ Recent posts