SQL Server 커서 이해와 활용

커서 개념

결과 집합은 SELECT 쿼리 실행 후 반환되는 모든 행 데이터의 모음입니다. 커서는 이러한 결과 집합을 처리하는 기능으로, 특정 행에 접근하여 데이터를 읽거나 쓸 수 있으며, 원하는 위치로 이동할 수 있습니다.

복잡한 저장 프로시저에서 자주 사용되는 커서의 주요 기능은 다음과 같습니다:
1. 결과 집합 내 특정 행에 대한 접근
2. 현재 위치 데이터의 읽기/쓰기
3. 행 단위로 조작 가능 (전체 행 처리가 아닌 개별 처리)
4. 집합 기반 DBMS와 행 기반 프로그래밍 간의 중개 역할

커서 유형

SQL Server에서 지원하는 서버 API 커서는 데이터 변경 감지 능력과 리소스 소비량에 따라 4가지로 구분됩니다:

  • 정적 커서: TempDB에 결과 집합을 생성하며, 커서 열기 시점의 데이터만 유지합니다. 외부 수정 사항은 재열람 시 반영됩니다.
  • 동적 커서: 결과 집합의 모든 변경 사항을 실시간 반영합니다. Fetch 시마다 데이터 값, 순서, 멤버십이 변경됩니다.
  • 단일 진행 커서: 순차적으로만 데이터를 추출할 수 있으며, 이동 중에는 외부 수정 사항을 반영하지 않습니다.
  • 키셋 드라이브 커서: 고정된 식별자로 구성된 결과 집합을 유지하며, 특정 열 수정 시 반영 가능합니다.

커서 생명주기

커서는 선언 → 열기 → 데이터 추출 → 닫기 → 해제의 5단계로 구성됩니다.

1. 커서 선언 문법

DECLARE cursor_name CURSOR [LOCAL | GLOBAL] 
     [FORWARD_ONLY | SCROLL] 
     [STATIC | KEYSET | DYNAMIC | FAST_FORWARD] 
     [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] 
     [TYPE_WARNING] 
     FOR select_statement 
     [FOR UPDATE [OF column_name [, ...n]]]

2. 동적 커서 예시

DECLARE orderCursor CURSOR SCROLL
FOR SELECT OrderId FROM bigorder WHERE orderNum='ZEORD003402'

3. 커서 열기

OPEN orderCursor

4. 데이터 추출

FETCH [NEXT|PRIOR|FIRST|LAST|ABSOLUTE n|RELATIVE n]
FROM [GLOBAL] cursor_name
INTO @variable_name[, ...]

5. 데이터 처리 예시

DECLARE @orderId INT
FETCH ABSOLUTE 3 FROM orderCursor INTO @orderId
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @orderId AS id
    FETCH NEXT FROM orderCursor INTO @orderId
END

6. 데이터 수정/삭제

UPDATE bigorder SET UserId='123' WHERE CURRENT OF orderCursor
DELETE bigorder WHERE CURRENT OF orderCursor

7. 커서 닫기 및 해제

CLOSE orderCursor
DEALLOCATE orderCursor

태그: SQL Server Cursors T-SQL Database Programming

5월 23일 15:14에 게시됨