Tipi MULTISET: accesso Poiche non e previsto un ordine tra gli elementi un accesso diretto come quello visto per gli array non e possibile E necessario utilizzare funzioni ad hoc Tali funzioni possono comunque essere utilizzate anche per gli array 177 Tipi MULTISET: accesso Tali funzioni trasformano un valore di tipo collezione in una tabella La tabella puo poi essere acceduta come una qualunque altra tabella Vediamo una sola di queste funzioni UNNEST 178
Funzione UNNEST UNNEST(<espressione>) 179 Il tipo di <espressione> deve essere collezione Restituisce gli elementi contenuti in <espressione> in una tabella virtuale, <espressione> puo anche essere il risultato di una query In questo caso deve essere restituita una sola tupla di tipo collezione La tabella risultato puo essere utilizzata in modo analogo ad una tabella usuale nelle interrogazioni Non puo pero essere utilizzata nei comandi di manipolazione (INSERT, DELETE, UPDATE) Esempio: UNNEST in FROM CREATE TABLE Impiegati( imp# id_impiegato, nome VARCHAR(50), competenze VARCHAR(20) MULTISET); SELECT imp#, c FROM Impiegati I, UNNEST(I.competenze) c WHERE imp# = 2; Restituisce una tupla per ogni competenza dell impiegato 2 180 l.competenze rappresenta il valore del campo competenze per la generica tupla l acceduta C rappresenta una generica competenza dell impiegato I
Esempio: UNNEST in FROM Imp# 1 2 3 Nome Mario Rossi Luigi Verdi Gianni Bianchi Competenze MULTISET[ SQL, Java, C ] MULTISET[ Oracle, MYSQL, SQL ] MULTISET[ Oracle, SQL ] SELECT imp#, c FROM Impiegati I, UNNEST(I.competenze) c as Competenza WHERE imp# = 2; 181 Imp# 2 2 2 Competenza Oracle MYSQL SQL Esempio: UNNEST in FROM CREATE TABLE Impiegati( imp# id_impiegato, nome VARCHAR(50), competenze VARCHAR(20) MULTISET); SELECT * FROM UNNEST(SELECT competenze FROM Impiegati) c Errato perche la query non e scalare 182
Aggregazione per tipi collezione Sono state introdotte tre nuove funzioni di aggregazione per tipi collezione Tali funzioni possono essere utilizzate in modo analogo alle funzioni di aggregazioni gia note (COUNT, SUM, MAX, MIN, ecc) Le funzioni sono COLLECT FUSION INTERSECTION 183 COLLECT COLLECT Funzione di aggregazione che puo essere applicata a qualunque tipo di dato Dato un (multi-)insieme di valori S di un certo tipo T, corrispondenti ad un gruppo,produce un MULTISET su T, contenente tutti i valori in S In pratica,trasforma i valori di un gruppo in un multiset 184
Esempio: UNNEST in FROM Imp# 1 2 3 Nome Mario Rossi Luigi Verdi Gianni Bianchi Competenze MULTISET[ SQL, Java, C ] MULTISET[ Oracle, MYSQL, SQL ] MULTISET[ Oracle, SQL ] SELECT COLLECT(I.Nome) as Elenco_Impiegati FROM Impiegati I; Elenco_Impiegati MULTISET[ Mario Rossi, Luigi Verdi, Gianni Bianchi ] 185 FUSION FUSION Funzione di aggregazione che puo essere applicata ad attributi di tipo MULTISET Dato un (multi-)insieme di multiset S, corrispondenti ad un gruppo, restituisce l unione dei multiset in S Il numero di duplicati nel multiset risultato è la somma del numero di duplicati che occorrono in ogni multiset del gruppo 186
Esempio: UNNEST in FROM Imp# 1 2 3 Nome Mario Rossi Luigi Verdi Gianni Bianchi Competenze MULTISET[ SQL, Java, C ] MULTISET[ Oracle, MYSQL, SQL ] MULTISET[ Oracle, SQL ] SELECT FUSION(I.Competenze) as Competenze_tot FROM Impiegati I; Competenze_tot MULTISET[ SQL, SQL, SQL, Java, C, MYSQL] 187 INTERSECTION INTERSECTION Funzione di aggregazione che puo essere applicata ad attributi di tipo MULTISET Dato un (multi-)insieme di multiset S, corrispondenti ad un gruppo, restituisce l intersezione dei multiset in S Il numero di duplicati nel multiset risultato è il minimo del numero di duplicati che occorrono in ogni multiset del gruppo 188
Esempio: UNNEST in FROM Imp# 1 2 3 Nome Mario Rossi Luigi Verdi Gianni Bianchi Competenze MULTISET[ SQL, Java, C ] MULTISET[ Oracle, MYSQL, SQL ] MULTISET[ Oracle, SQL ] SELECT INTERSECTION(I.Competenze) as Competenze_tot FROM Impiegati I; Competenze_tot MULTISET[ SQL ] 189 Esempio con gruppi Imp# 1 2 3 Nome Mario Rossi Mario Rossi Gianni Bianchi Competenze MULTISET[ SQL, Java, C ] MULTISET[ Oracle, MYSQL, SQL ] MULTISET[ Oracle, SQL ] SELECT I.Nome As Nome, FUSION(I.Competenze) as Competenze_tot FROM Impiegati I GROUP BY Nome; Nome Mario Rossi Competenze_tot MULTISET[ SQL, SQL, Java, C, MySQL ] 190 Gianni Bianchi MULTISET[ Oracle, SQL ]
Casting per tipi collezione E possibile effettuare il casting di un tipo collezione in un altro tipo collezione se e solo se e possibile effettuare il cast tra il tipo degli elementi 191 Ereditarietà 192
Ereditarietà In SQL-2003, e prevista ereditarieta singola su tipi e su tabelle Ereditarieta di tipi Permette di definire relazioni di supertipo/sottotipo Permette il riuso di codice Aspetto intensionale Ereditarieta di tabelle Permette di definire relazioni tabella/sotto-tabella Permette di estendere interrogazioni ad insiemi di tabelle gerarchicamente organizzate Aspetto estensionale 193 Ereditarietà di tipi Un sottotipo eredita gli attributi, i metodi, ed i vincoli definiti per i suoi supertipi Il sottotipo può raffinare il supertipo con nuovi attributi e metodi Nel sottotipo è anche possibile ridefinire metodi ereditati 194
Ereditarietà di tipi Puo essere definita per ADT Ereditarietà singola CREATE TYPE <nome_tipo> UNDER <nome_supertipo> AS <definizione> [NOT] FINAL; il supertipo deve essere stato dichiarato con la clausola NOT FINAL 195 Ereditarietà di tipi Clausola FINAL: non si possono definire sottotipi Clausola NOT FINAL: si possono definire sottotipi la clausola NOT FINAL è obbligatoria se la dichiarazione non specifica una superclasse in caso contrario si può scegliere 196
Esempio CREATE TYPE t_veicolo AS (modello CHAR(20), n_licenza INTEGER, ultima_revisione DATE) METHOD prox_revisione( ) RETURNS DATE NOT FINAL; 197 Esempio CREATE TYPE t_camion UNDER t_veicolo AS (peso INTEGER) NOT FINAL; CREATE TYPE t_bus UNDER t_veicolo AS (n_posti INTEGER) NOT FINAL; 198
Metodi & ereditarietà CREATE TYPE t_persona AS (nome CHAR(20), id INTEGER, data_di_nascita DATE, indirizzo t_indirizzo) METHOD età() RETURNS INTEGER NOT FINAL; 199 CREATE TYPE t_insegnante UNDER t_persona AS (stipendio DECIMAL(9,2), data_assunzione DATE, corso t_corso) NOT FINAL; Metodi & ereditarietà I metodi sono ereditati dai sottotipi allo stesso modo degli attributi: CREATE TABLE Insegnanti OF t_insegnante; SELECT nome, I.età( ) FROM Insegnanti I WHERE stipendio > 3000; 200
Metodi & ereditarietà E possibile ridefinire un metodo ereditato non è possibile ridefinire gli attributi Ad esempio al tipo t_insegnante può essere associato un metodo età che restituisce l anzianità di servizio (overriding) 201 Esempio CREATE TYPE t_insegnante UNDER t_persona AS (stipendio DECIMAL(9,2), data_assunzione DATE, corso t_corso) OVERRIDING METHOD età() RETURNS INTEGER NOT FINAL; 202
Tipi non instanziabili La dichiarazioni di un tipo specifica se il tipo può essere instanziato (quindi puo avere istanze proprio) oppure no Il default è INSTANTIABLE CREATE TYPE <nome tipo> AS <lista definizione attributi> [{INSTANTIABLE NOT INSTANTIABLE}] {FINAL NOT FINAL} 203 Sostituibilità 204 Negli OODBMS vale il principio della sostituibilità Un istanza di un tipo può essere utilizzata ovunque ci si aspetti un istanza del suo supertipo Questo principio non vale negli attuali ORDBMS per garantire sostituibilità: E necessario invocare una opportuna funzione di CAST
Ereditarietà di tabelle 205 Poiche non vale il principio di sostituibilita, in SQL- 2003 non e possibile inserire un istanza di un sottotipo in una tabella tipata basata sul super-tipo Esempio CREATE TYPE T2 UNDER T1 CREATE TABLE Tab1 OF T1 Istanze di T2 non possono essere inserite in Tab1 Per gestite istanze di T1 e istanze di T2 e quindi necessario creare due tabelle tipate In questo modo pero il contenuto delle due tabelle e indipendente, benche i tipi su cui si basano sono collegati da una relazione di ereditarieta Ereditarieta di tabelle Per risolvere questo problema, in SQL-2003 e possibile definire ereditarieta tra tabelle tipate Condizione: se Tab2 e una sotto-tabella di Tab1, allora il tipo T2 di Tab2 deve essere un sotto-tipo del tipo T1, su cui e definita Tab1 206
Esempio CREATE TABLE persone OF t_persona; CREATE TABLE insegnanti of t_insegnante UNDER persone; E stata creata una gerarchia tra le tabelle persone e insegnanti Cio e possibile poiche t_insegnante e sotto-tipo di t_persona 207 Interrogazioni La gerarchia d ereditarietà definita sulle tabelle influenza i risultati delle interrogazioni Una interrogazione fatta su una tabella si propaga automaticamente alle sottotabelle Lo stesso vale per le operazioni di cancellazione e modifica mentre una operazione di inserimento coinvolge solo una specifica tabella se si vuole restringere l operazione alle istanze di una certa tabella: ONLY 208
Esempio nome id data_di_nascita indirizzo Smith 74 16/8/68 John 86 3/2/48 Persone nome id data_di_nascita indirizzo Allen 82 9/7/67 Mark 81 3/5/58 stipendio. 30ml 60ml Insegnanti 209 Esempio SELECT nome FROM Persone WHERE data_di_nascita > 1/1/1967; Il risultato sarà: Smith e Allen SELECT nome FROM ONLY Persone WHERE data_di_nascita > 1/1/1967; 210 Il risultato sarà: Smith
Esempio DELETE FROM Persone WHERE id > 80; Cancellerà John dalla tabella Persone e Allen e Mark dalla tabella Insegnanti 211