본문으로 바로가기

커서(MS-SQL)

category 컴퓨터/데이터베이스 2016. 6. 13. 17:16
안녕하세요? QRD입니다.

오늘은 MS-SQL에서 커서(Cursor)을 이용하는 방법에 대해서 알아보려 합니다.
커서란 무엇인가부터 사용법까지 알려드리겠습니다.

커서란?
‘커서’는 SELECT 문장 등에 의한 데이터베이스 검색에 의한 검색 실행 결과를 한 줄씩 검색하고, 처리하기 위해 데이터베이스 서버 측의 결과 집합과 행 획득 위치를 나타내는 개념을 말한다.
커서의 정의와 그 작업은 주로 응용 프로그램 등의 절차적 언어에서의 SQL 실행시 사용한다.

개념이 이해가 되시나요?
쉽게 풀어서 설명하자면, Select 문장을 이용해 나온 결과 물들이 100개의 행이 있다고 가정합시다.
이 결과물 1행, 2행, 3행, 4행에 대해 순차적으로 작업(Insert, Update .. )을 해주는 것이라고 생각하시면 됩니다.

Name Phone E-mail
Tucker Becker 080-185-6774 neque@sed.ca
Reese Mason 005-985-3955 bibendum@urna.org
Ross Savage 039-216-9099 eleifend.non@utodiovel.ca
Rahim Glover 055-126-3456 Sed.nec.metus@etcommodoat.net
Hashim Oconnor 027-190-3346 laoreet.posuere@magnaPraesentinterdum.co.uk

Select 결과가 위와 같이 나오고 1행 'Tucker Becker' 부터 5행 'Hashim Oconnor' 까지 다른 테이블에 Insert를 하기 위해 커서를 이용해 할 수 있다는 거죠.
그렇다면 이제 사용법을 알아보도록 합시다!
커서 사용 방법
사용하기에 앞서 용어 설명부터 해보겠습니다.

DECLARE CURSOR : 커서 정의
OPEN : 커서 열기
FETCH : 커서 포인터가 가리키는 위치의 행 데이터를 검색하고 포인터를 하나의 행 진행
FETCH_STATUS : FETCH의 실행 상태를 반환(0 : 성공, -1 : 실패, -2 : 행 없음)
CLOSE (커서 닫기)

아래에서 코드와 함께 설명하겠습니다.
DECLARE @NAME VARCHAR (100);
DECLARE @PHONE VARCHAR (100);
DECLARE @EMAIL VARCHAR (100);

DECLARE [커서 이름] CURSOR FOR --1)

SELECT Name, Phone, E-mail --2)
FROM [테이블 이름]

OPEN [커서 이름] --3)
  FETCH NEXT FROM [커서 이름] INTO @NAME,@PHONE,@EMAIL --4)

  WHILE (@@FETCH_STATUS=0) --5)
    BEGIN
        INSERT INTO [Insert 할 테이블 이름] (Name, Phone, Email) --6)
        VALUES (@NAME, @PHONE, @EMAIL)
        FETCH NEXT FROM [커서 이름] INTO @NAME,@PHONE,@EMAIL --7)
    END

CLOSE [커서 이름] --8)
DEALLOCATE [커서 이름] --9)

1) 커서를 선언합니다.
2) 커서를 통해 데이터를 가공(Insert, Update, Delete..) 할 데이터를 Select 문을 통해 구합니다.
3) 커서를 시작합니다.
4) 커서가 첫 행을 읽어 변수에 대입합니다.
5) While 문을 통해 반복 작업을 수행합니다 (FETCH_STATUS : FETCH의 실행 상태 반환(0 : 성공, -1 : 실패, -2 : 행 없음))
6) 커서에 대입되어 있는 데이터를 작업합니다.(예시에서는 Insert를 작업합니다. 필요한 작업을 넣으시면 됩니다.)
7) 커서가 아직 작업하지 않은 다음 행을 읽어 변수에 대입합니다.
8) While문에서 빠져나온 커서를 닫습니다.
9) 커서에 할당된 자원을 해제합니다.


이해가 되셨나요?
한마디로 순서가 정해져 있는 형형색색의 구슬(데이터)이 들어 있는 상자A와 빈 상자B가 있다고 가정해 봅시다.
A에서 순서에 맞는 구슬 하나를 꺼내어 상자 B에 넣은 후(커서) 다른 색으로 칠합니다(작업).
또한 A가 모두 비거나, 구슬이 아닌 다른 물건이 나오면 그만(FETCH_STATUS 체크) 둡니다.
이것이 바로 커서의 모든 과정입니다.

이제 모두 이해하셨을 거라 생각됩니다만 백 번의 설명보다 한 번의 코딩이 더 좋은 방법이라 생각되며,
이 글을 읽고 있는 분이 꼭 혼자 코딩을 해보시며, 자유자재로 커서를 이용할 수 있다면 정말 좋겠습니다.

이번 포스팅은 여기까지 할게요!
감사합니다. QRD였습니다. 꾸벅(_ _)