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