Cursori

Questo articolo segue direttamente quanto indicato sulla documentazione ufficiale Microsoft sull’utilizzo dei cursori, conseguentemente la sintassi indicata è quella TSQL, ma i cursori sono definiti anche in altri tipi di DBMS come MySql o PostgreSQL.

Introduzione

Un cursore offre la possibilità di elaborare un set di dati (quindi il risultato di una SELECT) una riga alla volta.
Le istruzioni principali sono le sueguenti:

  • DECLARE CURSOR: definisce gli attributi di un cursore del server Transact-SQL, ad esempio lo scorrimento e la query utilizzata per compilare il set di risultati su cui agisce il cursore.
  • OPEN: esegue il popolamento del set di risultati e l’istruzione FETCH restituisce una riga dal set di risultati.
  • CLOSE: rilascia il set di risultati corrente associato al cursore.
  • DEALLOCATE rilascia le risorse utilizzate dal cursore.

Tipicamente la dichiarazione di un cursore segue questo pattern:

DECLARE @var1 VARCHAR(max);
DECLARE @var2 VARCHAR(max);

DECLARE Cursor_name CURSOR
FOR
SELECT var1
    , var2
FROM tabel_name

OPEN Cursor_name;

FETCH NEXT
FROM Cursor_name
INTO @var1
    , @var2;

WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT
    FROM Cursor_name
    INTO @var1
        , @var2;
END;

CLOSE Cursor_name;

DEALLOCATE Cursor_name;

Comandi e funzioni

@@FETCH_STATUS

Restituisce lo stato dell’ultima istruzione FETCH eseguita su qualsiasi cursore attualmente aperto dalla connessione.

Valore restituitoDescrizione
0L’istruzione FETCH ha avuto esito positivo.
-1L’istruzione FETCH ha avuto esito negativo oppure la riga non è compresa nel set di risultati.
-2La riga recuperata è mancante.

Viene spesso usata come condizione di uscita del ciclo WHILE:

WHILE @@FETCH_STATUS = 0

@@CURSOR_STATUS

Funzione scalare che consente al chiamante di una stored procedure di determinare se la procedura ha restituito o meno un cursore e un set di risultati per un determinato parametro.

@@CURSOR_ROWS

Restituisce il numero delle righe attualmente risultanti nell’ultimo cursore aperto sulla connessione.

DECLARE CURSOR

Definisce gli attributi di un cursore del server Transact-SQL, ad esempio lo scorrimento e la query utilizzata per compilare il set di risultati su cui agisce il cursore.
La dichiarazione standard di un cursore agisce secondo la sintassi seguente:

DECLARE cursor_name CURSOR
FOR select_statement

In cui select statement è l’istruzione SELECT standard che definisce il set di risultati del cursore.

OPEN

Apre un cursore server Transact-SQL e popola il cursore mediante l’istruzione Transact-SQL specificata nell’istruzione DECLARE CURSOR o SET cursor_variable.

OPEN cursor_name

FETCH

Recupera una riga specifica da un cursore server Transact-SQL.
Solitamente viene usato nel seguente modo:

FETCH NEXT
FROM cursor_name
INTO @variable_name

  • NEXT: restituisce la riga del set di risultati successiva alla riga corrente e imposta la riga corrente sulla riga restituita.
  • INTO @variable_name consente di inserire in variabili locali i dati delle colonne ottenute da un’operazione di recupero.

Ogni variabile dell’elenco, da sinistra a destra, è associata alla colonna corrispondente nel set di risultati del cursore.
A ogni variabile deve essere associato lo stesso tipo di dati o un tipo di dati che supporti la conversione implicita dal tipo di dati della colonna corrispondente nel set di risultati.
Il numero di variabili deve corrispondere al numero di colonne dell’elenco di selezione del cursore.

CLOSE

Chiude un cursore aperto rilasciando il set di risultati corrente e liberando i blocchi dei cursori mantenuti attivi sulle righe in cui è posizionato il cursore. L’istruzione CLOSE mantiene le strutture dei dati disponibili per successive operazioni di apertura. Le operazioni di recupero e di aggiornamento posizionato, tuttavia, sono consentite solo dopo la riapertura del cursore. È necessario eseguire l’istruzione CLOSE su un cursore aperto. L’esecuzione non è consentita su cursori solo dichiarati o già chiusi.

CLOSE cursor_name

DEALLOCATE

Rimuove un riferimento a un cursore. Dopo che l’ultimo riferimento al cursore è stato deallocato, le strutture di dati che includono il cursore vengono rilasciate da Microsoft SQL Server.

DEALLOCATE cursor_name

Indice

Share
Ultimi articoli
Join

Newsletter

Nessuno spam, solo articoli interessanti ;)

Focus

Post correlati

sharding

Cosa è il database sharding?

Introduzione Ogni applicazione che utilizza un database deve pensare a come gestire un aumento delle richieste e dell’utilizzo di questa ultima senza comprometterne l’usabilità. Rendere

WITH – Common Table Expression

Le Common Table Expression forniscono una sintassi alternativa per evitare l’accumularsi di query innestate: permettono di creare delle tabelle temporanee basandosi sui risultati di una

Utilizzare la clausola ROLLUP

Talvolta voglio eseguire una query che mi fornisca dei risultati aggregati di media, min, max… ma anche dei risultati sull’intero rowset senza aggregazione. Per avere

Codice Pragmatico

Contatti

Per informazioni, dubbi o consulenze non esitate a contattarmi.

Lascia un messaggio

Ricevi le ultime news

Iscrivi alla newsletter

Solo articoli interessanti, promesso ;)