상세 컨텐츠

본문 제목

MSSQL cursor(커서)로 반복처리 예제

IT컴퓨터

by 자기 2021. 10. 22. 12:34

본문

728x90

mssql에서 커서(cursor)를 이용하여 select한 결과로 얻은 데이터셋을 행단위로 하나씩 반복작업을 수행할 수 있습니다.

웹에서 select한 결과의 데이터셋을 읽어온 후에 for loop를 이용하여 행단위 작업을 할 수도 있겠지만

mssql db 자체에서 cursor를 이용한다면 궂이 웹에서의 처리가 필요없으므로 웹소스가 심플해 질 수 있습니다.

 

 

mssql 커서 사용 시 성능이슈

mssql에서 커서(cursor)를 사용하면 db성능을 떨어뜨릴 수 있습니다. 처리할 데이터가 적은 경우에는 거의 문제가 없겠지만 대량의 데이터를 처리하는 경우에는 성능저하의 원인이 되므로 커서를 사용하지 않는 것이 좋겠습니다.

mssql cursor 사용 시 자주 사용하는 키워드

DECLARE : 커서를 정의(선언)해 줍니다.

OPEN : 결과 데이터셋의 첫번째 행을 가리키도록 설정합니다.

FETCH : 결과 데이터셋의 다음 행으로 커서를 이동합니다.

CLOSE : 커서를 닫습니다.

 


다음은 실무에서 사용한 mssql 프로시저 내에서 코딩한 커서 예제입니다.

특정 조건이 만족하면 begin ~ end 사이의 커서 구문을 실행합니다.

 

if @status = '1' 
	begin					
		DECLARE MyCUR CURSOR FOR
		Select cNo from t_customer with (nolock) where id=@user_id
		OPEN MyCUR
		FETCH NEXT FROM MyCUR INTO @conNo
		WHILE @@FETCH_STATUS = 0
		BEGIN ------------
			set @m_status = ''
			SELECT @m_status=m_status, @s_code=s_code FROM TB_CUST with (nolock) where cust_no =@conNo						
			if @m_status <> ''
				Update t_customer set cStat=@m_status, s_code=@s_code where cNo = @conNo

			FETCH NEXT FROM MyCUR INTO @conNo
		END ------------
		CLOSE MyCUR
		DEALLOCATE MyCUR

	end

각각의 동작을 설명하면 다음과 같습니다.

 

 

DECLARE MyCUR CURSOR FOR -> DECLARE [커서이름] CURSOR FOR

커서이름을 정의해 줍니다. 예제에서는 MyCUR라고 선언하였습니다.

Select cNo from t_customer with (nolock) where id=@user_id

where절에 조건을 주어 특정 데이터셋을 불러옵니다.

예제에서는 cNo 컬럼값을 가져왔습니다.

OPEN MyCUR

FETCH NEXT FROM MyCURINTO @conNo

커서를 열고 처음 데이터로 가리킵니다.

이때 처음 데이터는 cNo컬럼값 중 첫번째 데이터인데 이 값을 @conNo 에 담습니다.

WHILE @@FETCH_STATUS = 0

BEGIN

이제 데이터셋이 없을 때까지 반복을 시작합니다.

이 다음부터 End 구문을 만날 때까지 실질적인 데이터 처리 루틴이 됩니다.

set @m_status = ''

@m_status 값을 초기화합니다.

SELECT @m_status=m_status, @s_code=s_code FROM TB_CUST with (nolock) where cust_no =@conNo

TB_CUST 테이블에서 특정 조건에 부합하는 컬럼(m_status, s_code)값을 가져옵니다.

if @m_status <> ''

Update t_customer set cStat=@m_status, s_code=@s_code where cNo = @conNo

@m_status에 값이 있는 경우 t_customer 테이블을 갱신합니다.

FETCH NEXT FROM MyCUR INTO @conNo

다음 행으로 이동합니다.

CLOSE MyCUR

DEALLOCATE MyCUR

커서를 닫고 초기화합니다.

 

 


 

여기까지의 핵심적인 코드를 좀 더 간단하게 요약정리하면 다음과 같습니다.

 

DECLARE MyCUR CURSOR FOR
Select cNo from t_customer with (nolock) where id=@user_id
OPEN MyCUR
FETCH NEXT FROM MyCUR INTO @conNo
WHILE @@FETCH_STATUS = 0
BEGIN ------------
	--여기에 반복작업을 할 구문들을 넣습니다.

	FETCH NEXT FROM MyCUR INTO @conNo
END ------------
CLOSE MyCUR
DEALLOCATE MyCUR

 

이상으로 mssql 커서 사용법에 대해서 알아보고 정리해 보았습니다.

감사합니다.

728x90

관련글 더보기

댓글 영역