[MS-SQL] CURSOR 반복문으로 모든 행을 읽자

SQL 에서 반복문을 수행할 수 있는 방식

반복문을 사용하기 위해 cursor를 이용하거나, while을 이용할 수 있다.

이번에는 cursor 기능을 활용하여 반복문을 수행하는 법을 공부하였다.

커서는 어떤 테이블(쿼리 결과도 포함) 의 모든 행을 하나씩 참조하여 원하는 행위를 할 수 있게 한다.

커서를 사용하면, 1번 부터 5번인 행을 모두 조회한다. (테이블에 데이터가 100만개가 있다 해도 커서는 모든 행을 돌기 때문에 성능 위주의 쿼리를 작성해야 한다면 좋지않은 선택일 수 도 있다)

  • CURSOR 선언하기
DECLARE myCur CURSOR FOR
SELECT Code1, Code2, Code3
FROM myTable

변수 선언하듯 Declare 명령어를 사용 후, 커서의 이름을 정한다. 또한, 해당 커서가 행을 조회하며 어떤 정보를 가져올지를 정한다.

  • 변수 선언하기
DECLARE @Volume NUMERIC(28,8)
DECLARE @Code1 NCHAR(8)
DECLARE @Code2 NVARCHAR(200)
DECLARE @Code3 NCHAR(8)

다음은 변수를 선언해준다. 변수를 선언해 원하는 정보를 변수 안에 할당하고, 이를 활용하기 위함이다.

  • 커서 열기, FETCH 하기
OPEN myCur
FETCH NEXT FROM myCur INTO @Code1, @Code2, @Code3

커서를 사용하기 위해서는 OPEN [커서명] 을 해줘야한다.

또한, FETCH NEXT FROM [커서명] INTO @values … 를 통해 커서가 다음 행을 읽기 위한 준비를 시켜야한다.

  • 원하는 반복 수행 코드 짜기
WHILE (@@FETCH_STATUS = 0)
BEGIN
	UPDATE #myTable1
	SET InvQty = @Volume + @InQty - @OutQty
	WHERE CsCode = @CsCode AND ItemCode = @ItemCode		
        SET @Volume = @Volume + @InQty - @OutQty
FETCH NEXT FROM myCur INTO @CsCode, @ItemCode, @InQty, @OutQty, @InOutDate
END

위 UPDATE 로직은 임의로 내가 만든 컬럼 값 업데이트 로직이다. 저런식으로 변수를 적절히 활용해

원하는 반복작업을 수행하면 된다.

@@FETCH_STATUS 는 0과 -1 상태 두가지가 있는데, 스태터스가 0 이면 아직 FETCH 할 행이 남아있다는 뜻, -1이면 더이상 FETCH 할 행이 남아있지 않다는 뜻.

즉, 해당 while문을 걸면 테이블의 모든 행을 조회할 때까지 CURSOR 가 FETCH 한다는 뜻이다.

반복문 마지막에 FETCH NEXT FROM myCur INTO … 를 해줘야 다음행으로 FETCH가 된다.

  • 마지막에는 CURSOR를 지워주기
CLOSE myCur
DEALLOCATE myCur

커서를 오픈하면 메모리상에 계속 띄워진 상태로 있는다해서 닫는것을 권장한다고 한다. 아직 자바의 GC나 이런 메모리 관련 이슈들을 몸소 겪어보지 않아 납득이 잘가지는 않지만 일단 하라는대로..

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x