MY MEMO
[SQL SERVER] Cursor 본문
커서 : 행의 집합을 처리
성능에 별로 좋지 않은 영향
처리 순서
커서 선언 -> 커서 열기 -> 커서 데이터 가져오기 -> 데이터 처리 -> 커서 닫기 -> 커서 해제
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 |