본문 바로가기

카테고리 없음

CURSOR

회사에서 MSSQL을 많이 사용하는데


언제부턴가 간단한 조회문과 수정문 + 노가다로만 일을 하는게 느껴졌다.



프로시저를 많이 사용하는데 이제는 단순한 입출력 외에 쿼리 튜닝까지도 생각해야되는 단계에 이른것 같아 간단히나마 회사에서 했던 내용들을 정리하려한다.






그래서 오늘은 'CURSOR' 에 대해 작성하려 한다.



CURSOR



커서. 테이블을 로우수대로 분리해준다고 생각하면 편한다.


그 분리한 로우를 가지고 여러가지 작업( 테이블 INSERT, 프로시저 실행 등) 여러가지를 할 수 있다.


※ 참고로 커서는 디비성능에 그렇게 좋은 방법은 아니다. SQL Server 성능에 많은 영향을 끼칠 뿐더러 일반 SELECT 문보다 부하가 심하고 느리다.

그럼에도 사용하는 이유는 단순히 몇줄의 쿼리만으로 작업하기가 어려운 경우들이 있기때문에 이런게 있다 정도의 숙지는 해놓는게 좋다.




보통 커서를 단순 셀렉하는 경우보다는 각각의 로우별로 작업하는 경우에 많이 사용하기 때문에 예제를 통해서


커서를 선언 -> 값을 담고 -> 로우별로 돌리는 걸 이야기하려한다.





--커서를 사용하기 위해서는 선언이 필요하다. 선언 후에 쪼개고 싶은 조회쿼리를 적어준다 . (나는 금액,구분,일자를 검색하여 해당 데이터로 작업을 하려한다.) 


DECLARE CUR_PAY CURSOR

FOR SELECT 

AMT

,GUBUN

,DATE

FROM TBL_PAY


--커서에다가 해당 데이터를 담을거라는걸 선언해 줬으니, 이제 커서를 열 차례다.


OPEN CUR_PAY


--커서를 열어줬으니 이제 커서를 사용해보자 . 커서를 돌려서 나오는 내용을 변수에 SET 해주려면 변수도 선언해줘야한다.


DECLARE @AMT INT, @GUBUN VARCHAR(1), @DATE DATETIME



FETCH NEXT FROM CUR_PAY 

INTO @AMT

 ,@GUBUN

 ,@DATE


--셀렉트의 개수와 선언갯수를 맞춰줘야한다.


--로우수가 0이 될때까지 돌려주기위함

WHILE  (@@FETCH_STATUS = 0 )

BEGIN

--각각의 변수가지고 작업하고 싶은 내용을 적는다.

PRINT @AMT

PRINT @GUBUN

PRINT @DATE


--다음 로우를 또 변수에 넣어준다.

FETCH NEXT FROM CUR_PAY 

INTO @AMT

             ,@GUBUN

             ,@DATE


END



이런식으로 커서를 사용할 수 있다.



잠깐 간단하게 정리하는거라 내용이 부실할 수 있으나 이정도만 숙지해놓고 나중에 커서가 필요할 경우에 다시 검색해서 작업에 참고하면 될 것 같다.


원래 개발은 구글이 해주는거니까.