바다토리 웨어하우스

MSSQL 많이 활용하는 cursor문 본문

IT/mssql

MSSQL 많이 활용하는 cursor문

바다토리 2022. 5. 3. 22:51
반응형

보통은 Loop를 돌며, 데이터를 처리해야 할 경우, 응용프로그램단에서 처리를 많이 하지만, Batch작업이나, Batch프로세스의 경우는 DB 자체에서 많이들 처리합니다. 

Agent에서 스케쥴링을 걸 수도 있고, Log제공 등 다양한 기능을 제공하기에 DB자체에서 사용하는 게 편리할 때도 있습니다.

 

그중 가장 많이 사용하는 것이 바로 Cursor형. 

데이터를 조하고 그 조회된 값을 기준으로 Loop를 돌면서 처리를 할 때 주로 사용합니다. 

 

cursor를 사용하기 위해서는 먼저 선언을 해주어야합니다. 

DECLARE 커서명 CURSOR FOR

 

Loop를 돌며 처리할 기본 데이터 조회하는 구문을 넣습니다. 

SELECT name, grade FROM SCHOOL ORDER BY name

 

cursor작업이 다시 실행된다 하더라도 데이터의 일괄성을 위해 조회하는 구문에 Order by를 넣어 주어,

cursor 되는 순서를 일치시켜주는 것이 좋습니다.

 

OPEN 커서명 

Select조회 값이 커서명에 저장이 되며, 그 저장 값을 불러들이기 위해 Open을 합니다.

 

Fetch Next From 커서명 into @name, @grade

select내용이 저장된 커서명으로부터 @name과 @grade로 가져오겠다는 의미입니다.

 

WHILE @@fetch_status=0

   BEGIN

 

  END

fetch_status값이 0이 될 때까지, 즉 커서명에 담긴 내용이 모두 읽힐 때까지 Loop를 돕니다. 

이때 Begin과 End사이에 각 행의 값으로 실행해줄 구문을 넣어 줍니다. 

또한 End가 나오기 전에 Fetch Next From 커서명 into @name, @garde를 해줌으로써,

다음행의 값을 @name과 @grade에 넣어주도록 합니다.

 

close 커서명

모든 cursor작업이 끝나면 열려있는 커서명을 닫아줍니다. 

 

Deallocate 커서명

그리고 커서명에 할당된 내용을 모두 해제시켜줍니다.

 

위의 설명을 토대로 예시를 작성해 보겠습니다. 

SCHOOL이란 테이블에서 이름과 학년 정보를 가져와서 

1학년인 경우 1학년 테이블(Grade1)에 넣고, 2학년인 경우 2학년 테이블(Grade2)에 넣는

작업을 커서 문으로 작성해보도록 하겠습니다. 

물론 Where조건절에 학년으로 해서 통으로 넣으면 좋지만. 이해를 돕기 위한 예제이니

살펴보도록 합니다.

 

 

DECLARE @name nvarchar(10), @grade nchar(1)

DECLARE cur_Test CURSOR FOR
SELECT name, grade FROM SCHOOL  --school 테이블에서 가져온 name, grade를 cur_test에 할당

OPEN cur_Test  --cursor를 오픈

FETCH NEXT FROM cur_Test INTO @name, @grade  -- SCHOOL의 name과 grade가 저장된 내용을 @name과 @grade변수에 저장

WHILE @@FETCH_STATUS = 0  --cursor의 내용이 모두 읽힐 때까지 반복
BEGIN

     IF @grade=1  --@grade가 1학년인 경우 1학년 테이블에 INSERT

       begin

            INSERT INTO GRADE1(name) value(@name)

       end

    ELSE IF @grade=2  --@grade가 2학년인 경우 2학년 테이블에 INSERT

       begin

            INSERT INTO GRADE2(name) value(@name)

       end

FETCH NEXT FROM cur_Test INTO @name, @grade  --cursor에서 다음행의 name, grade값을 @name, @grade에 대입
END

CLOSE cur_Test   -- cur_Test를 닫아줌
DEALLOCATE cur_Test   -- cur_test에 할당된 내역을 해제시킴.

 

 

이렇게 하면, 학년에 따라 서로 다른 테이블에 Insert를 시킬 수 있을 것입니다.

따라서 While 가 진행되는 동안 구문을 통해 여러 가지 조건식 및 처리 작업을 넣음으로써, 다양한 방법으로 응용을 할 수 있을 것입니다. 

반응형
Comments