Controllo del flusso nel T-SQL
Come in tutti i linguaggi di programmazione che si rispettino anche
il Transact SQL possiede istruzioni per il controllo del flusso logico del programma. Ne abbiamo di due tipi: IF ELSE e il loop WHILE, vorrei però aggiungere in questa lezione
anche la funzione CASE molto utile nella programmazione
T-SQL.
Prima di analizzare in dettaglio questi costrutti diamo un occhio
su come usare l’istruzione BEGIN END.
L’istruzione BEGIN END
L’istruzione BEGIN END, viene comunemente utilizzata per raggruppare più istruzioni SQL o T-SQL in un unico blocco. Dal punto di vista della logica di programmazione l’istruzione BEGIN END è utilissima per racchiudere porzioni di codice pronte per essere eseguite, ad esempio, all’interno di una IF ELSE.
Vediamo un esempio:
/* Blocco di istruzioni all’interno di BEGIN END */
BEGIN –- apro il blocco
/* Dichiaro la variabile */
DECLARE @au_lname AS CHAR(20)
/* Inizializzo la variabile */
SET @au_lname = ‘’
/* Recupero il valore e lo assegno con una istruzione SELECT
*/
SELECT @au_lname = au_lname FROM authors WHERE au_id =
‘aaa-aaa-aaa’
/* Stampo il valore che ho precedentemente recuperato */
PRINT @au_lname
END –- chiudo il blocco
L’uso deve essere fatto in coppia, ad ogni BEGIN deve
corrispondere una propria END, altrimenti il parser ci
segnala un errore. BEGIN END viene generalmente usata in
questi casi:
- Un loop WHILE che ha bisogno di includere interi blocchi
di istruzioni. - Un elemento della funzione CASE che deve includere
blocchi di istruzioni. - Una clausola IF o ELSE che deve includere blocchidi istruzioni.
Il costrutto IF ELSE
Chi possiede una minima esperienza con la programmazione avrà sicuramente incontrato l’istruzione IF ELSE essa è la struttura fondamentale per l’elaborazione condizionale.
In parole povere quando il programma incontra una IF valuta
la condizione specificata di seguito e se è vera prende una
certa strada, altrimenti se è falsa ne prende un’altra. Possiamo pensare ad IF ELSE come un semaforo condizionale a due vie. Le condizioni che può valutare una IF ELSE in SQL Server possono essere due: TRUE o FALSE.
Vediamo la sintassi dell’istruzione
IF espressione_booleana
{ istruzione_SQL | blocco_istruzioni
}
[ ELSE
{ istruzione_SQL | blocco_istruzioni }
]
Possiamo osservare che l’espressione ELSE è opzionale,
solamente la IF è necessaria.
Vediamo alcuni utilizzi
/*
1° Esempio di IF ELSE
*/
SELECT au_id FROM dbo.authors WHERE au_lname = 'Luca'
IF @@ROWCOUNT > 0
/* E' possibile solamente una riga di istruzione */
PRINT 'AUTORE TROVATO'
ELSE
/* E' possibile solamente una riga di istruzione */
PRINT 'AUTORE NON TROVATO'
/* 2° Esempio di IF ELSE , in questo caso viene utilizzata
anche il blocco
BEGIN END per poter includere più righe
di istruzioni SQL */
SELECT au_id FROM dbo.authors WHERE au_lname = 'Black'
IF @@ROWCOUNT > 0 BEGIN
/* E' possibile inserire più righe di istruzioni
SQL */
PRINT 'AUTORE TROVATO'
PRINT '----------------------------------'
END
ELSE BEGIN
/* E' possibile inserire più righe di istruzioni
SQL */
PRINT 'AUTORE NON TROVATO'
PRINT '----------------------------------'
END
Gli esempi chiariscono a sufficienza i campi di utilizzo di questa istruzione.
Il costrutto WHILE
Setta una condizione per l’esecuzione ripetuta di una ( o di
un blocco) di istruzioni SQL. Tipicamente le istruzioni SQL sono racchiuse all’inteno di un blocco BEGIN END. Vediamone la sintassi
WHILE espressione_booleana
{ istruzione_SQL | blocco_istruzioni
}
[ BREAK ]
{ istruzione_SQL | blocco_istruzioni
}
[ CONTINUE ]
Le istruzioni SQL vengono eseguite ripetutamente finchè la
condizione specificata è vera, a quel punto si esce dal
loop. E’ possibile controllare l’esecuzione delle
istruzioni all’interno del loop attraverso le parole chiave
BREAK e CONTINUE.
Break
Causa l’uscita immediata dal loop, quando all’interno
di un ciclo WHILE si incontra la parola chiave BREAK le istruzioni
SQL fino alla parola chiave END vengono saltate.
Continue
Reinizializza il ciclo, ripartendo dalla condizione booleana, tutte
le istruzioni SQL dopo la parola chiave CONTINUE vengono ignorate.
Ecco un esempio di un tipico ciclo WHILE
DECLARE @contatore AS INTEGER
SET @contatore = 0
WHILE @contatore < 100 BEGIN
IF @contatore = 50
BREAK
SET @contatore = @contatore + 1
END
PRINT @contatore
CASE
Valuta un elenco di condizioni e ritorna uno dei risultati tra quelli possibili. L’argomento ELSE è opzionale. La funzione CASE permette l’uso di elaborazioni condizionali all’interno di una query. Può essere usata all’interno di istruzioni select, inser, update e delete. E’ molto utile alla causa della programmazione T-SQL,
perché semplifica molti passaggi laboriosi e ridondanti. Esistono due differenti sintassi per l’istruzione CASE, semplice e ricercata.
Primo uso della funzione CASE (semplice)
CASE espressione_input
WHEN espressione_when THEN
espressione_risultato
[ ...n
]
[
ELSE
espressione_risultato
]
END
Secondo uso della funzione CASE (ricercata):
CASE
WHEN espressione_booleana
THEN espressione_risultato
[ ...n
]
[
ELSE
espressione_risultato
]
END
Usare l’espressione CASE semplice
E’ possibile verificare (solo uguaglianza) un’espressione particolare e paragonarla con una serie di espressioni o valori differenti. Vediamone un esempio.
USE pubs
GO
SELECT Categoria =
CASE type
WHEN
'popular_comp' THEN 'Computer'
WHEN
'mod_cook' THEN 'Cucina moderna'
WHEN
'business' THEN 'Business'
WHEN
'psychology' THEN 'Psicologia'
WHEN
'trad_cook' THEN 'Cucina tradizionale'
ELSE 'Nessuna
categoria'
END,
title AS
'Titolo'
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
Nell’esempio precedente abbiamo costruito un piccolissimo report abbinando la funzione CASE ad una istruzione SELECT, come potete osservare il valore del campo type viene confrontato con l’espressione di input all’interno di WHEN. Il confronto viene fatto sulla base dell’equaglianza dei valori
di input.
Usare l’espressione CASE ricercata
A differenza della precedente forma in questo caso la funzione CASE
presenta un’espressione booleana di confronto per ogni
clausola WHEN specificata. Vediamone un esempio
USE pubs
GO
SELECT 'Categoria di prezzo' =
CASE
WHEN price IS NULL
THEN '*'
WHEN price < 10
THEN '**'
WHEN price >=
10 and price < 20 THEN '***'
ELSE
'****'
END,
title
FROM titles
ORDER BY price
GO
In questo caso abbiamo costruito un semplice rating in funzione delle diverse categorie di prezzo per i libri del database pubs. A differenza del caso precedente la funzione CASE ricercata nella clausola WHEN abbiamo un’espressione booleana che viene valutata.
Nel caso il risultato sia true viene riportata l’espressione dopo la parola chiave THEN, altrimenti verrà riportata quella specificata nella parola chiave ELSE.
Possiamo paragonare questa forma di espressione CASE alla istruzione SELECT usata in Visual Basic.
E’ sempre consigliato specificare la clausola ELSE
all’interno delle nostre funzioni CASE.
Nella prossima puntata del tutorial parleremo delle viste.