Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Controllo del flusso nel T-SQL

I cicli nel T-SQL.
I cicli nel T-SQL.
Link copiato negli appunti

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.


Ti consigliamo anche