행 집합을 다루는데 편리한 기능

성능을 크게 떨어뜨리는 요인이라 사용을 자제하는것이 좋음


여러 개의 행을 쿼리한 후에 쿼리의 결과인 행 집합을 한 행씩 처리하기 위한 방식



커서의 처리 순서

커서 선언 (declare)

커서 열기 (open)

-------------------------------------------

커서에서 데이터 가져오기 (fetch)

데이터 처리

------------------------------------------- while문으로 모든 행이 처리될 때까지 반복

커서 닫기 (close)

커서의 해제 (deallocate)



커서의 확장 구문

[local/global] 디폴트는 global

local

지역 커서는 지정된 범위 안에서만 유효하며 해당 범위를 벗어나면 소멸함

프로시저에서 output 매개변수로 커서를 밖으로 돌려주면 커서를 참조하는 변수가 해제되거나 소멸할 때 같이 커서도 소멸됨 (close, deallocate 자동)


global

전역 커서는 모든 프로시저나 일괄처리에서 커서의 이름을 참조 가능


[forward_only/scroll]

forward_only

시작 행부터 끝행의 방향으로만 커서가 이동함

사용 가능한 데이터 가져오기는 detch next 한정


scroll

커서 이동이 자유로움

fetch next, first, last, prior 등 여러가지 사용 가능


[static/dynamic/keyset/fast_forward] 디폴트는 dynamic

static

원본 테이블을 tempdb로 가져올 때 사용할 데이터를 보두 복사해서 데이터를 사용함

커서의 선언 이후 원본 테이블에 변경사항이 있어도 커서에서는 변경 전 데이터를 사용하여 변경 사항을 알 수 없음


dynamic

행 데이터를 가지고 올  때마다 원본 테이블에서 가져옴

원본 테이블의 update, insert 내용이 모두 보임


keyset

모든 키 값을 tempdb에 저장

원본 테이블의 update 된 내용만 보이며 insert된 내용은 보이지 않음

keyset을 사용하려면 원본 테이블에 꼭 고유 인덱스(unique key)가 있어야 함 


fast_forward

forward_olny와 read_only 옵션이 합쳐진 것

커서에서 행 데이터를 수정하지 않을 것이라면 가장 바람직한 옵션


[read_only, scroll_locks, optimistic]

read_only

읽기 전용으로 설정하는 것


scroll_locks

위치 지정 업데이트나 삭제가 가능하도록 설정하는 것


optimistic

커서로 행을 읽어들인 후 원본 테이블의 행이 업데이트 되었다면 커서에서 해당 행을 위치 지정 업데이트나 삭제하지 않도록 지정



type_warning

요청한 커서 형식이 다른 형식으로 암시적으로 변환된 경우 클라이언트에 경고 메시지를 보내는 것

예를 들어 코유 인덱스가 없을 때 keyset 커서 를 만들려고하면 암시적 변환이 작동해 static 커서로 만들어짐

이 엽션을 설정하지 않으면 아무 메시지가 나오지 않아 알수없음

이 옵션을 설정하면 문제를 미리 경고 메시지로 확인 가능함



FORselect_statement

select 문장을 사용하는 부분

select문의 결과가 한 행씩 처리됨

compute, compute by, for browse, into 키워드는 사용 불가



for update [of column_name [...n]]

그냥 for update만 지정하면 select 문의 모든 열을 업데이트 가능

of 열이름 을 지정하면 특정 열 지정 가능




커서 사용 시 기본적으로 전역 커서로 열기를 시도함

만약 지역, 전역에 같은 이름의 커서가 있다면 지역이 우선 됨

같은 이름이 있다면 꼭 global 키워드를 써줘야 전역 커서 열기 가능



'MSSQL' 카테고리의 다른 글

사용자 정의 함수  (0) 2016.03.10
블로킹과 교착상태  (0) 2016.03.10
트랜잭션과 잠금  (0) 2016.03.10
저장 프로시저  (0) 2016.03.10
인덱스  (0) 2016.03.10

+ Recent posts