본문 바로가기
DB/MS-SQL

[MSSQL] 커서(Cursor) 사용법

by KeepCoding 2020. 6. 3.

[커서란?]

행 단위 작업의 반복 작업을 가능케 하는 기능.

앞서 소개했던 WHILE문 과 같이 반복 수행이 가능하면서도 특정 테이블의 튜플들에 접근해 하나씩 처리할 수 있는 추가 기능을 갖고 있는 문법이다.

 

 

 

[실행 단계]

단계

설명

DECLARE
(커서 선언)
커서를 정의 및 생성하는 명령문
 OPEN
(커서 열기)
SELECT 결과의  첫번째 튜플을 가르키도록 설정하는 명령문
FETCH
(커서 이동)
'기존에 가르키던 SELECT 결과의 튜플'의 다음 튜플을 가르키도록 설정하는 명령문
CLOSE
(커서 닫기)
SELECT 결과에 대한 처리 종류 후 커서를 닫는 명령문
DEALLOCATE
(커서 해제)
커서를 닫은 후 할당된 메모리를 해제하는 명령문

 

 

 

[예제]

test_Table에 있는 모든 사람의 나이에 1살을 추가하는 예제.

- test_Table에 값 삽입
INSERT INTO test_Table (No, Name, Age) VALUES (0, 'JANG', 22)
INSERT INTO test_Table (No, Name, Age) VALUES (1, 'MOON', 23)
INSERT INTO test_Table (No, Name, Age) VALUES (2, 'CHAE', 24)
INSERT INTO test_Table (No, Name, Age) VALUES (3, 'YUG', 25)
INSERT INTO test_Table (No, Name, Age) VALUES (4, 'YOON', 26)

- 반복문에서 사용할 변수 @Age 선언
DECLARE @Age;

- Cur 라는 이름의 커서 생성
DECLARE Cur CURSOR FOR
- Cur라는 커서로 test_Table의 첫번째 Row를 가르키고 그 Row에서 Age값을 가져오겠다.
SELECT Age FROM test_Table

- 커서 열기
OPEN Cur

- 커서가 가르키는 위치를 test_Table의 첫번째 Row로 이동해서 가져온 Age값을 @Age에 넣겠다.
FETCH NEXT FROM Cur INTO @Age;

- 반복문 시작
- @@FETCH_STATUS 는 커서가 제대로 값을 가져왔을시 0을 마지막 Row일시 -1을 반환함.
WHILE (@@FETCH_STATUS =0)
BEGIN
	- @Age에 1을 더한다.
	SET @Age += 1;
    
    - 커서가 가르키고 있는 Row에 해당하는 Age컬럼의 값을 @Age로 변경한다.
    UPDATE test_Table SET Age = @Age WHERE CURRENT OF Cur
    
    - 커서를 다음 Row로 이동시키고 가져온 Age값을 @Age에 넣겠다.
    FETCH NEXT FROM Cur INTO @Age;
END

- 커서 닫기
CLOSE Cur;

- 커서에 할당된 메모리 해제
DEALLOCATE Cur;

- test_Table에 있는 모든 행의 Age에 +1이 되었는지 확인.
SELECT * FROM test_Table;

 

댓글