Corso di Basi di Dati 10. Esercitazioni in SQL: Complementi A.A. 2016 2017
Funzioni condizionali Vediamo qualche altro comando utile di SQL. Il comando coalesce ammette come argomento una sequenza di espressioni e restituisce il primo valore non nullo. La funzione può quindi essere usata per convertire valori nulli in valori espliciti. Esempio: La sequente query estrae dalla tabella Impiegati(Nome, Dipart, Stipendio) i nomi degli impiegati ed i dipartimenti cui afferiscono gli impiegati, usando la stringa Ignoto nel caso in cui non si conosca il dipartimento. select Nome, coalesce(dipart,"ignoto") from Impiegati
Funzioni condizionali Il comando nullif fa il contrario: ammette come argomento una espressione e un valore costante; se l espressione è pari al valore costante, la funzione restituisce NULL, altrimenti restituisce il valore dell espressione. Esempio: La sequente query estrae dalla tabella Impiegati(Nome, Dipart, Stipendio) i nomi degli impiegati ed i dipartimenti cui afferiscono gli impiegati, mettendo il dipartimento al valore NULL se il dipartimento è la stringa Ignoto. select Nome, nullif(dipart,"ignoto") from Impiegati
Funzioni condizionali Il comando case case permette di specificare strutture condizionali, il cui risultato dipende dalla valutazione del contenuto delle tabelle. La sintassi ammette due varianti. La prima riguarda una singola espressione: case espressione case when valoredellespressione then risultato case when altrovaloredellespressione then altrorisultato case... case else altrorisultato end
Funzioni condizionali Esempio: consideriamo la tabella Veicoli(Targa, Tipo, KWatt). Calcoliamo le tasse di circolazione: per le auto, è 2.58 KWatt, mentre per le moto è (22.00 + 1.00 KWatt). Per altri tipi, mettiamo NULL. Creiamo il risultato con le colonne Targa, Tasse. select Targa, case Tipo case when auto then 2.58 KWatt case when moto then (22.00 + 1.00 KWatt) case else NULL end as Tasse from Veicoli
Funzioni condizionali La seconda è più generica: case case when criterio then espressione case when altrocriterio then altraespressione case... case else altraespressione end
Funzioni condizionali Esempio: nella tabella Impiegati(Nome, Ufficio, Dipart, Stipendio), aumentiamo lo stipendio: del 10%, se l impiegato lavora in amministrazione, ufficio 10; del 20%, se l impiegato lavora in amministrazione, non nell ufficio 10; del 15%, se l impiegato lavora in produzione, non nell ufficio 10.
Funzioni condizionali update Impiegati set Stipendio = case when (Dipart = "Amministrazione" and Ufficio = 10) then Stipendio * 1.1 when (Dipart = "Amministrazione" and Ufficio <> 10) then Stipendio * 1.2 when Dipart = "Produzione" then Stipendio * 1.15 else Stipendio end
Transazioni La sintassi per specificare transazioni, cioè sequenze di operazioni in SQL, è la seguente: start transaction; singole operazioni... commit work; Esempio: start transaction; update ContoCorrente set Ammontare = Ammontare + 10 where NumConto = 12202; update ContoCorrente set Ammontare = Ammontare - 10 where NumConto = 42177; commit work;
Transazioni Osservazioni: SQL include la possibilità di comandi procedurali (if, goto, ecc...) all interno delle transazioni, comandi che non vedremo. Anche un comando per interrompere l intera transazione evitando ogni modifica ai dati: rollback work. Il DBMS è organizzato in modo che l esecuzione di una transazione sia indipendente dalla contemporanea esecuzione di altre transazioni. In particolare: il risultato dell esecuzione contemporanea di più transazioni deve essere uguale al risultato che le stesse transazioni otterrebbero qualora ciascuna di esse fosse eseguita da sola, l esecuzione di un rollback di una transazione non deve causare il rollback di altre transazioni, eventualmente generando una reazione a catena. Questo sia in caso di rollback volontario, cioè dato come comando in una transazione, sia in caso di rollback forzato, cioè causato da un errore.
Procedure SQL permette la definizione di procedure, che normalmente vengono memorizzate all interno della base di dati come parti dello schema. Come accade nei linguaggi di programmazione (ad es. C), le procedure permettono di associare un nome ad una sequenza di istruzioni SQL, con la possibilità di specificare dei parametri (argomenti). Una volta che la procedura è definita, essa è utilizzabile come se facesse parte dell insieme dei comandi SQL predefiniti.
Procedure Esempio: consideriamo la tabella Dipartimenti(Nome, Città). Creiamo una procedura che accetti come argomenti il nome di un dipartimento ed una città, e che assegni la città specificata al dipartimento specificato. procedure AssegnaCittà(:Dipartimento varchar(20), :Città varchar(20)) begin update Dipartimenti set Città = :Città where Nome = :Dipartimento; end; Osservazione: la sintassi può variare a seconda del DBMS.
Procedure Una volta definita questa procedura, si potrà usarla come un comando SQL. Ad esempio, per assegnare la città Roma al dipartimento di nome Matematica, useremo: mysql>assegnacittà("matematica", "Roma"); Osservazione: non è necessario sapere in quale tabella sono immagazzinati questi dati, o in che modo. Basta sapere che la base di dati è dotata di questa procedura.
Procedure Le procedure possono coinvolgere un numero qualsiasi di tabelle e di colonne. Esempio: consideriamo le tabelle Impiegati(Nome, Città) e Dipartimenti(NomeDip, Città). Definiamo una procedura che cambia la città in entrambe le tabelle, da una :VecchiaCittà ad una :NuovaCittà. procedure Trasloco(:VecchiaCittà varchar(20), :NuovaCittà varchar(20)) begin update Dipartimenti set Città = :NuovaCittà where Città = :VecchiaCittà; update Impiegati set Città = :NuovaCittà where Città = :VecchiaCittà; end;
Trigger SQL mette a disposizione anche i trigger, detti anche regole attive. Un trigger: si attiva quando accade uno specifico evento all interno della base di dati e controlla se è soddisfatta una data condizione. Se sì, allora esegue un azione stabilita.
Trigger Sintassi: create trigger NomeTrigger after azione da controllare for each row when condizione azione del trigger
Trigger Esempio: create trigger ImpiegatiSenzaDip after insert into Impiegati for each row when (new.dipart is null) update Impiegato set Dipart = "NuoviArrivati" where Matr = new.matr Il trigger viene attivato tutte le volte che il sistema rileva l inserimento di righe all interno della tabella Impiegati. Se la condizione che segue when è soddisfatta, ovvero se la riga inserita ha NULL sulla colonna Dipart, l azione del trigger viene eseguita: assegna all attributo Dipart del nuovo impiegato il valore Nuovi Arrivati.
Trigger Ogni trigger è sensibile a un solo evento. L azione da controllare può solo riguardare operazioni SQL di aggiornamento dello stato della base di dati, ovvero insert e delete su tabelle, e update su tabelle o singoli attributi. Nel criterio dopo when è possibile utilizzare le variabili predefinite new e old, che si riferiscono alla nuova e alla vecchia versione della riga aggiunta o modificata. L azione del trigger, è rappresentata da un singolo comando o una procedura SQL.
Trigger Un applicazione tipica dei trigger è l introduzione di vincoli d integrità personalizzati. Va però tenuto sotto controllo il rischio di trigger a catena : essi reagiscono a modifiche della base di dati, e possono a loro volta modificare la base di dati. Quindi l attivazione di un trigger può causare l attivazione di altri trigger, con il rischio di attivazioni cicliche che non terminano.