Partilhar via


Usando o tipo de dados cursor em um parâmetro OUTPUT

Os procedimentos armazenados do Transact-SQL podem usar o tipo de dados cursor apenas para parâmetros OUTPUT. Se o tipo de dados cursor for especificado para um parâmetro, serão necessários ambos os parâmetros VARYING e OUTPUT. Se a palavra-chave VARYING for especificada para um parâmetro, o tipo de dados deve ser cursor e a palavra-chave OUTPUT deve ser especificada.

ObservaçãoObservação

O tipo de dados cursor não pode ser associado a variáveis de aplicativos por meio de APIs de banco de dados, como OLE DB, ODBC, ADO e DB-Library. Como os parâmetros OUTPUT devem ser associados antes de um aplicativo poder executar um procedimento armazenado, os procedimentos armazenados com parâmetros OUTPUT cursor não podem ser chamados das APIs do banco de dados. Esses procedimentos podem ser chamados de lotes, procedimentos armazenados ou gatilhos do Transact-SQL apenas quando a variável OUTPUT de cursor é atribuída a uma variável Transact-SQLcursor local.

Parâmetros de saída de cursor

As regras seguintes pertencem aos parâmetros de saída de cursor quando o procedimento é executado:

  • Para um cursor de somente avanço, as linhas retornadas no conjunto de resultados do cursor são apenas as que estão na posição do cursor ou além dela durante a conclusão do procedimento executado, por exemplo:

    • Um cursor não rolável é aberto em um procedimento em um conjunto de resultados nomeado RS de 100 linhas.

    • O procedimento busca as primeiras 5 linhas de conjunto de resultados RS.

    • O procedimento retorna ao chamador.

    • O conjunto de resultados RS retornado ao chamador consiste de linhas de 6 a 100 do RS, e o cursor no chamador está posicionado antes da primeira linha do RS.

  • No caso de um cursor de somente avanço, se o cursor estiver posicionado antes da primeira linha na conclusão do procedimento armazenado, todo o conjunto de resultados será retornado ao lote, procedimento armazenado ou gatilho do chamador. No retorno, a posição do cursor é estabelecida antes da primeira linha.

  • No caso de um cursor de somente avanço, se o cursor estiver posicionado depois do fim da última linha na conclusão do procedimento armazenado, um conjunto de resultados vazio será retornado ao lote, procedimento armazenado ou gatilho do chamador.

    ObservaçãoObservação

    Um conjunto de resultados vazio não é igual a um valor nulo.

  • No caso de um cursor rolável, todas as linhas no conjunto de resultados são retornadas ao lote, procedimento armazenado ou gatilho do chamador na conclusão da execução do procedimento armazenado. No retorno, a posição de cursor é mantida na posição da última busca executada no procedimento.

  • Para qualquer tipo de cursor, se o cursor for fechado, um valor nulo é retornado ao lote, procedimento armazenado ou gatilho do chamador. Isso também acontecerá se o cursor for atribuído a um parâmetro, mas nunca for aberto.

    ObservaçãoObservação

    O estado fechado só tem importância no momento do retorno. Por exemplo, é válido fechar um cursor a meio caminho do procedimento, abri-lo novamente no procedimento e retornar o conjunto de resultados desse cursor para o lote, procedimento armazenado ou gatilho do chamador.

Exemplo

No exemplo a seguir, foi criado um procedimento armazenado que especifica um parâmetro de saída @currency\_cursor usando o tipo de dados cursor. O procedimento armazenado é, então, chamado em um lote

Primeiro, crie o procedimento que declara e, então, abra um cursor na tabela Moeda.

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

A seguir, execute um lote que declare uma variável de cursor local, execute o procedimento para atribuir o cursor à variável local e depois busque as linhas do cursor.

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