MY MEMO

[SQL SERVER] Cursor 본문

STUDYING/SQL SERVER

[SQL SERVER] Cursor

l_j_yeon 2018. 3. 19. 11:43

커서 : 행의 집합을 처리

성능에 별로 좋지 않은 영향


처리 순서

커서 선언 -> 커서 열기 -> 커서 데이터 가져오기 -> 데이터 처리 -> 커서 닫기 -> 커서 해제


DECLARE userTbl_cursor CURSOR GLOBAL/LOCAL(default) + STATIC

FOR SELECT height FROM userTbl;


OPEN usrTbl_cursor;

: 내부적으로 위의 쿼리문을 실행해서 cursor에 데이터를 담아 놓음


DECLARE @id NVARCHAR(10)

DECLARE @sum BIGINT

DECLARE @userGrade NCHAR(50)


FETCH NEXT FROM userCur INTO @id, @sum -- 첫 행 값을 대입


WHILE(@@FECTCH_STATUS=0)  -- 행이 없을 때까지 반복 

BEGIN

SET @userGrade = 

CASE

WHEN (@sum >= 1500) THEN '고객'

ELSE '유령 고객'

UPDATE userTbl SET grade = @userGrade WHERE userID = @id

FETCH NEXT FROM userCur INTO @id, @sum

END


CLOSE userCur -- 커서 닫기

DEALLOCATE userCur -- 커서 해제


FETCH OPTION


1) FORWARD_ONLY : 시작행부터 끝행의 방향으로만 커서가 이동

   SCROLL : 자유롭게 커서가 이동이 가능하기 때문에 FETCH NEXT / FIRST / LAST / PRIOR를 사용할 수 있다


2) STATIC / KEYSET / DYNAMIC / FAST_FORWARD


STATIC(모두 복사) : 모두 tempdb에 복사한 후 데이터를 사용 -> 원본 데이터가 변경되어도 커서에서 데이터 인풀시에는 복사된 변경 전의 데이터를 가져옴! -> 변경사항을 알 수 없다!


DYNAMIC / KEYSET

(접근하는 행만 복사 단 key값을 어떻게 가져오느냐가 문제!)

 : STATIC과 반대의 개념으로 커서에 행 데이터를 접근할 때마다 원본 테이블에서 가져옴

DYNAMIC : 현재 key 값만 tempdb에 복사하므로 INSERT UPDATE 모두 가져올 수 있음(커서가 진행중일때 데이터의 입력이나 수정이 확인)

KEYSET : 키 값은 모두 가져오므로 INSERT는 확인이 안되고 UPDATE만 확인됨


+) PRIMARY KEY가 없으면 (ex) UNIQUE, index 등)이 없으면 결국 option이 없는것과 같음 (STATIC과 같음)(무슨 KEY를 이용해야하는지 알 수 없음)

=> TYPE_WARNING을 사용!


ex) DECLARE keysetTbl_cursor CURSOR GLOBAL FORWARD_ONLY KEYSET TYPE_WARNING

FOR SELECT id, txt FROM keysetTbl;

: 현재 이 테이블에는 index값이 없음 -> KEYSET이 자신의 기능을 하지 못하고 STATIC으로 반응하므로 TYPE_WARNING시 에러 나옴


FAST_FORWARD : FORWARD_ONLY + READ_ONLY


FETCH NEXT / PRIOR / FIRST / LAST


+) 성능 순서 : FAST_FORWARD > STATIC > KEYSET > DYNAMIC


GLOBAL : 실행하고 날아가지 않음

LOCAL : 실행하면 날아감 -> 실행하고 다시 정의하려고 하면 커서가 없다고 뜸


참고 그림) STATIC / KEYSET / DYNAMIC의 차이



'STUDYING > SQL SERVER' 카테고리의 다른 글

[SQL SERVER] 전체 텍스트 검색 & XML  (0) 2018.03.19
[SQL SERVER] Trigger  (0) 2018.03.19
[SQL SERVER] 저장 프로시저와 사용자 정의 함수  (0) 2018.03.16
[SQL SERVER] Transaction  (0) 2018.03.16
[SQL SERVER] Index  (0) 2018.03.16
Comments