프로그래밍/DB

[DB] MSSQL 커서사용법(Cursor)

ss-pro 2020. 9. 10. 22:04
반응형

 

MSSQL에서 여러개의 행의 결과값을 보통의 경우는 한번에 처리하는게 좋으나 행별로 처리해야될경우가 있습니다. 
행별로 처리할경우에 커서를 이용하여 처리할수 있습니다. 프로그램에서 레코드셋 오픈후 루프를 돌려서 처리하는 경우와 비슷하다고 보면됩니다.

1. DECLARE 커서 
- 먼저커서를 선언합니다. 이때 조회하고자 하는 결과값을 SELECT문을 이용해서 선언합니다. 
2. 커서 OPEN
- 커서를 오픈합니다. 
3. FETCH 처리   
- 첫번째 행을 가지고 옵니다. 
4. WHILE @@FETCH_STATUS = 0
- 커서의 마지막행이 될때까지 반복합니다. 이부분에 행단위로 가지고와서 데이터를 처리하면됩니다. 
5.  CLOSE 커서
- 커서를 닫습니다.  
6.  DEALLOCATE  커서
- 커서 참조를 제거합니다. 마지막 커서 참조가 할당 취소되면 Microsoft SQL Server에서 커서를 구성하는 데이터 구조의 할당을 취소합니다.

@@FETCH_STATUS   : 현재 연결에서 연 모든 커서에 실행된 마지막 커서 FETCH 문의 상태를 반환합니다.
반환 값설명  

 0 FETCH 문이 성공적으로 수행되었습니다.
-1 FETCH 문이 실패했거나 행이 결과 집합의 범위를 벗어났습니다.
-2 인출된 행이 없습니다.
-9 커서는 페치 작업을 수행하지 않습니다.

커서예제. (MSDN)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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  

s


내용을 보면 MSSQL서버에서 커서작업을 하는부분은 ADO, ADO.NET에서 레코드셋을 열어서 작업하는 부분과 거의 동일합니다. 

참고)
docs.microsoft.com/ko-kr/sql/t-sql/language-elements/fetch-transact-sql?view=sql-server-ver15

반응형