Homa Page di Daniele Franceschini
Gestione dei cursori con Transact-SQL
- Dettagli
- Categoria principale: Code Snippets
- Pubblicato Mercoledì, 06 Agosto 2008 21:35
- Visite: 2192
Nel libro "Transact SQL Programmazione avanzata" di Itzik Ben-Gan e Tom Moreau si legge che si giustifica l'uso dei cursori solo per le seguenti ragioni: Spero che il caso vostro sia solo l'ultimo. L'implementazione dei cursori richiede i seguenti comandi: Sintassi come riportata dal manuale in linea Significati delle varie opzioni: Significa che l'accesso al cursore sarà consentito solo all'interno della stored. Significa che tutti i livelli nidificati di stored procedure potranno accedervi, se non esiste una vera esigenza se ne sconsiglia l'uso. Specifica che l'unico tipo di istruzione FETCH che sarà possibile fare è la FETCH NEXT, ossia sarà possibile scorrere il cursore solo in avanti. L'istruzione SCROLL permette lo scorrimento sia in avanti che indietro del cursore. Ovviamente indica che il cursore e di sola lettura. Posiziona i locks sulle righe mentre vengono elaborate in modo che sia garantito l'aggiornamento delle righe attraverso il cursore. Non può essere utilizzata con l'opzione FAST_FOREWARD. Si riferisce al locking ottimistico, se si aggiorna una tabella presente nel cursore e la riga è stata cambiata da quando è stata elaborata, si ottiene l'errore 16934 "Optimistic concurrency check failed. The row was outside the cursor" Dopo aver specificato il cursore si invia il comando OPEN per cominciare a ricevere le righe, questo è il punto in cui viene eseguita la select stabilita nella dichiarazione del cursore. Per recuperare una riga si utilizza il comando FETCH, non esiste modo per recuperare gruppi di righe. La sintassi del comando è la seguente: Le opzioni FETCH sono regolate dalla dichiarazione DECLARE CURSOR, FORWARD_ONLY e FAST_FORWARD permettono solo l'opzione NEXT. Con KEYSET, STATIC, o SCROLL si possono utilizzare tutte le opzioni. Con DYNAMIC si può utilizzare tutto tranne ABSOLUTE. Per indicare la posizione alle opzioni ABSOLUTE e RELATIVE è possibile utilizzare variabili di tipo smallint, int, o tinyint. Se non si specifica la clausola INTO l'intera riga avrà un output come se si facesse select, in caso contrario bisognerà specificare una variabile per ogni colonna presente nella select. Utili qualora si voglia aggiornare o cancellare delle righe presenti nel cursore. Per specificare la riga corrente da aggiornare si usa l'istruzione CURRENT nella clausula WHERE. L'istruzione CLOSE rilascia alcune risorse occupate dal cursore come il set dei risultati e il lock che ha sull'ultima riga elaborata. L'istruzione CLOSE non rilasci il cursore. Per rilasciare definitivamente il cursore è necessario utilizzare l'istruzione DEALLOCATE.
ISTRUZIONE DECLARE
DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ] LOCAL
GLOBAL
FORWARD_ONLY
SCROLL
STATIC, KEYSET, DYNAMIC, FAST_FORWARD (Sensibilità del cursore)
READ_ONLY
SCROLL_LOCKS
OPTIMISTIC
Se le opzioni READ_ONLY, OPTIMISTIC o SCROLL_LOCK non sono state specificate nella definizione del cursore, il comportamento predefinito è il seguente:
ISTRUZIONE OPEN
ISTRUZIONE FETCH
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ] ISTRUZIONE UPDATE/DELETE
ISTRUZIONE CLOSE
ISTRUZIONE DEALLOCATE




