개발 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) 사용방법에 관련한 포스팅을 마치도록 하겠습니다.
반응형