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
Vedere anche