OUTPUT 매개 변수에 cursor 데이터 형식 사용
Transact-SQL 저장 프로시저는 OUTPUT 매개 변수에만 cursor 데이터 형식을 사용할 수 있습니다. 매개 변수에 cursor 데이터 형식을 지정할 경우 VARYING과 OUTPUT 매개 변수가 모두 필요합니다. 매개 변수에 VARYING 키워드를 지정한 경우에는 데이터 형식이 cursor여야 하고 OUTPUT 키워드를 지정해야 합니다.
[!참고]
cursor 데이터 형식은 OLE DB, ODBC, ADO, DB-Library 등의 데이터베이스 API를 통해 응용 프로그램 변수에 바인딩할 수 없습니다. OUTPUT 매개 변수는 응용 프로그램이 저장 프로시저를 실행하기 전에 바인딩되어야 하므로 cursor OUTPUT 매개 변수가 있는 저장 프로시저는 데이터베이스 API에서 호출할 수 없습니다. 이러한 프로시저는 Transact-SQL 로컬 cursor 변수에 cursor OUTPUT 변수가 할당된 경우에만 Transact-SQL 일괄 처리, 저장 프로시저 또는 트리거에서 호출할 수 있습니다.
Cursor Output 매개 변수
프로시저 실행 시 cursor Output 매개 변수에는 다음 규칙이 적용됩니다.
정방향 전용 커서의 경우, 저장 프로시저의 실행이 끝났을 때 커서의 결과 집합에는 커서 위치와 같거나 이보다 뒤에 있는 행만 반환됩니다. 예를 들면 다음과 같습니다.
비스크롤형 커서는 프로시저에서 100개의 행이 있는 RS라는 결과 집합에 열려 있습니다.
프로시저는 RS 결과 집합의 처음 5개 행을 인출합니다.
프로시저가 호출자에게 반환됩니다.
호출자에게 반환된 RS 결과 집합은 6에서 100 사이인 RS의 행으로 구성되며 호출자의 커서는 RS의 첫 번째 행 앞에 놓입니다.
정방향 전용 커서의 경우, 저장 프로시저의 실행이 끝났을 때 커서가 첫 번째 행보다 앞에 있으면 호출한 일괄 처리, 저장 프로시저, 트리거에 전체 결과 집합이 반환됩니다. 반환될 때 커서 위치는 첫 번째 행 앞으로 설정됩니다.
정방향 전용 커서의 경우, 저장 프로시저의 실행이 끝났을 때 커서가 마지막 행보다 뒤에 있으면 호출한 일괄 처리, 저장 프로시저, 트리거에 빈 결과 집합이 반환됩니다.
[!참고]
빈 결과 집합은 Null 값과 다릅니다.
스크롤형 커서의 경우, 저장 프로시저의 실행이 끝났을 때 결과 집합의 모든 행이 호출한 일괄 처리, 저장 프로시저, 트리거에 반환됩니다. 반환될 때 커서 위치는 프로시저에서 마지막으로 실행된 인출 위치가 됩니다.
커서의 종류에 관계없이 커서를 닫으면 호출한 일괄 처리, 저장 프로시저, 트리거에 Null 값이 전달됩니다. 매개 변수에 커서를 할당했지만 해당 커서를 전혀 열지 않은 경우도 마찬가지입니다.
[!참고]
커서의 닫힌 상태는 반환 시에만 문제가 됩니다. 예를 들어 프로시저를 통해 커서를 일부 닫은 후 프로시저에서 나중에 다시 열어 호출한 일괄 처리, 저장 프로시저, 트리거에 커서의 결과 집합을 반환하는 것은 유효합니다.
예
다음 예에서는 cursor 데이터 형식을 사용하여 출력 매개 변수 @currency\_cursor를 지정하는 저장 프로시저가 생성됩니다. 그런 다음 일괄 처리의 저장 프로시저가 호출됩니다.
먼저 선언된 프로시저를 만들고 Currency 테이블에서 커서를 엽니다.
USE AdventureWorks;
GO
IF OBJECT_ID ( 'dbo.uspCurrencyCursor', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.uspCurrencyCursor;
GO
CREATE PROCEDURE dbo.uspCurrencyCursor
@CurrencyCursor CURSOR VARYING OUTPUT
AS
SET NOCOUNT ON;
SET @CurrencyCursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT CurrencyCode, Name
FROM Sales.Currency;
OPEN @CurrencyCursor;
GO
다음으로 지역 커서 변수를 선언하는 일괄 처리를 실행하고, 지역 변수에 커서를 할당하는 프로시저를 실행한 다음, 커서에서 행을 인출합니다.
USE AdventureWorks;
GO
DECLARE @MyCursor CURSOR;
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN;
FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO