Condividi tramite


Utilizzo del tipo di dati cursor in un parametro OUTPUT

Nelle stored procedure Transact-SQL è possibile utilizzare il tipo di dati cursor solo per i parametri OUTPUT. Se per un parametro viene specificato il tipo di dati cursor, i parametri VARYING e OUTPUT sono obbligatori. Se per un parametro viene specificata la parola chiave VARYING, è necessario impostare il tipo di dati cursor e specificare la parola chiave OUTPUT.

Nota

Il tipo di dati cursor non può essere associato a variabili di applicazione tramite le API di database, quali OLE DB, ODBC, ADO e DB-Library. Poiché in un'applicazione è possibile eseguire una stored procedure solo in seguito all'associazione dei parametri OUTPUT, le stored procedure con parametri OUTPUT di tipo cursor non possono essere chiamate dalle API di database. È possibile chiamare queste procedure da batch, stored procedure o trigger Transact-SQL solo quando la variabile OUTPUT di tipo cursor è assegnata a una variabile locale Transact-SQL di tipo cursor.

Parametri di output di tipo cursor

Quando si esegue la procedura, per i parametri di output di tipo cursor vengono applicate le regole seguenti:

  • Con cursori forward-only, il set di risultati del cursore include solo le righe che al completamento della stored procedure si trovano oltre la posizione del cursore, ad esempio:

    • Un cursore non scorrevole viene aperto in una procedura per un set di risultati di 100 righe denominato RS.

    • La procedura recupera le prime 5 righe del set di risultati RS.

    • La procedura restituisce il set di risultati al chiamante.

    • Il set di risultati RS restituito al chiamante include le righe comprese tra la riga 6 e la riga 100 di RS e la posizione del cursore nel chiamante precede la prima riga di RS.

  • Con cursori forward-only, se al termine della stored procedure la posizione del cursore precede la prima riga, al batch, alla stored procedure o al trigger chiamante viene restituito l'intero set di risultati. Quando viene restituito, il cursore è posizionato prima della prima riga.

  • Con cursori forward-only, se al termine della stored procedure il cursore è posizionato oltre l'ultima riga, al batch, alla stored procedure o al trigger chiamante viene restituito un set di risultati vuoto.

    Nota

    Un set di risultati vuoto non equivale a un valore Null.

  • Con cursori scorrevoli, al termine dell'esecuzione della stored procedure al batch, alla stored procedure o al trigger chiamante vengono restituite tutte le righe del set di risultati. Quando viene restituito, il cursore è nella stessa posizione in cui si trovava durante l'ultima operazione di recupero eseguita dalla procedura.

  • Con qualsiasi tipo di cursore, se il cursore è chiuso, al batch, alla stored procedure o al trigger chiamante viene restituito un valore Null. Ciò si verifica anche quando un cursore viene assegnato a un parametro, ma non viene mai aperto.

    Nota

    Lo stato chiuso di un cursore è rilevante solo in fase di restituzione. È possibile, ad esempio, chiudere un cursore nel corso di una procedura e riaprirlo in una fase successiva della procedura prima che venga restituito il set di risultati corrispondente al batch, alla stored procedure o al trigger chiamante.

Esempio

Nell'esempio seguente viene creata una stored procedure in cui è specificato il parametro di output @currency_cursor utilizzando il tipo di dati cursor. La stored procedure viene quindi chiamata in un batch.

Creare innanzitutto la procedura per la dichiarazione e l'apertura di un cursore per la tabella Currency:

USE AdventureWorks2008R2;
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

Eseguire quindi un batch che dichiara una variabile locale di cursore, esegue la procedura per assegnare il cursore alla variabile locale e recupera le righe dal cursore.

USE AdventureWorks2008R2;
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