행 집합을 다루는데 편리한 기능
성능을 크게 떨어뜨리는 요인이라 사용을 자제하는것이 좋음
여러 개의 행을 쿼리한 후에 쿼리의 결과인 행 집합을 한 행씩 처리하기 위한 방식
커서의 처리 순서
커서 선언 (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 키워드를 써줘야 전역 커서 열기 가능