개발 Recording/MSSQL

[MSSQL] 커서(cursor) 사용방법

코드파인더 2021. 12. 16. 08:40
반응형

MSSQL에서 여러개의 행의 결과값을 보통의 경우 한번에 처리하는게 좋으나 행별로 처리해야 할 경우가 있습니다.  커서(cursor)는 행 단위 작업을 효율적으로 하기 위한 방식으로 테이블에서 여러개의 행을 조회한 후 쿼리의 결과를 한행씩 처리하는 방식입니다. SELECT한 결과를 반복 작업해줘야 할 경우 유용하게 사용 가능 한 방식입니다.

 

 

커서(corsor)의 특징

커서는 크게 아래와 같은 특징을 가지고 있습니다.

내장 SQL문의 수행 결과로 반환될 수 있는 복수의 튜플들을 액세스 할 수 있도록 해줍니다.

질의 수행 결과로 반환되는 첫번째 튜플에 대한 포인터로 생각할 수 있습니다.

커서를 사용하여 질의 결과로 반환 될 수 있는 튜플들을 한번에 하나씩 차례대로 처리할 수 있습니다.

 

커서(corsor) 사용시 주의사항

쿼리의 결과인 행 집합을 커서가 한행씩 읽어가면서 처리하고 처리가 끝나면 커서는 다음행을 처리하게 됩니다. 하지만 커서의 편리함에도 불구하고 SQL의 성능을 떨어트리는 큰 요인이 되기도 합니다. 적은 데이터를 처리 할 경우 그렇게 큰 차이가 나지 않겠지만 많은 데이터를 처리할 경우에는 커서사용을 피하는 것이 좋습니다.

 

커서(corsor) 작성 순서

1. DECLARE 커서

  • 먼저커서를 선언합니다. 이때 조회하고자 하는 결과값을 SELECT문을 이용해서 선언합니다. 

2. 커서 OPEN

  • 커서를 오픈합니다. 

3. FETCH 처리 :

  • 첫번째 행을 가지고 옵니다. 

4. WHILE @@FETCH_STATUS = 0

  • 커서의 마지막행이 될때까지 반복합니다. 이부분에 행단위로 가지고와서 데이터를 처리하면됩니다. 

5. CLOSE 커서

  • 커서를 닫습니다.  

6. DEALLOCATE  커서

  • 커서 참조를 제거합니다. 마지막 커서 참조가 할당 취소되면 Microsoft SQL Server에서 커서를 구성하는 데이터 구조의 할당을 취소합니다.

7. @@FETCH_STATUS

  • 현재 연결에서 연 모든 커서에 실행된 마지막 커서 FETCH 문의 상태를 반환합니다.
  • 반환값 0 : FETCH 문이 성공적으로 수행되었습니다.
  • 반환값 -1 : FETCH 문이 실패했거나 행이 결과 집합의 범위를 벗어났습니다.
  • 반환값 -2 : 인출된 행이 없습니다.
  • 반환값 -9 : 커서는 페치 작업을 수행하지 않습니다.

 

커서(corsor) 예제

아래 예제는 MSSQL 문서에 있는 예제를 참조하였습니다.

USE AdventureWorks2012;  
GO  

-- Declare the variables to store the values returned by FETCH.  
DECLARE @LastName VARCHAR(50), @FirstName VARCHAR(50);  
 
DECLARE contact_cursor CURSOR FOR  
SELECT LastName, FirstName FROM Person.Person  
WHERE LastName LIKE 'B%'  
ORDER BY LastName, FirstName;  
 
OPEN contact_cursor;  
 
-- Perform the first fetch and store the values in variables.  
-- Note: The variables are in the same order as the columns  
-- in the SELECT statement.  
 
FETCH NEXT FROM contact_cursor  
INTO @LastName, @FirstName;  
 
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.  
WHILE @@FETCH_STATUS = 0  
BEGIN  
 
   -- Concatenate and display the current values in the variables.  
   PRINT 'Contact Name: ' + @FirstName + ' ' +  @LastName  
 
   -- This is executed as long as the previous fetch succeeds.  
   FETCH NEXT FROM contact_cursor  
   INTO @LastName, @FirstName;  
END  
 
CLOSE contact_cursor;  
DEALLOCATE contact_cursor;  
GO  

 

여기까지 MSSQL 커서(cursor) 사용방법에 관련한 포스팅을 마치도록 하겠습니다.

반응형