Primo compitino: Modelli dei Dati di Nuova Generazione 14 Aprile 2005 NOME: COGNOME: Esercizio 1 2 Totale Punti previsti 20 13 33 Punti assegnati 1 Esercizio 2 Si consideri il seguente schema relazionale, relativo ai programmi dei teatri genovesi: TEATRI(CodT, NomeTeatro, Indirizzo, Tel) SPETTACOLI(CodS, CodT, Titolo, Autore, Regista, DataI, DataF) ATTORI_E_REGISTI(CodA, Nome,Cognome, CodC) COMPAGNIE(CodC, Nome, Citta_di_riferimento) RECITA_In(CodS, CodA) Il campo Regista in SPETTACOLI e’ chiave esterna su ATTORI_E_REGISTI. Le altre chiavi esterne sono quelle ovvie. Il campo indirizzo e’ di fatto un campo composto da (Via, Numero, Cap). I campi (Nome,Cognome) in ATTORI_E_REGISTI sono chiave secondaria. Il campo NomeTeatro e’ chiave secondaria in TEATRI. I campi (CodT,Titolo,DataI) sono chiave secondaria in SPETTACOLI . Il campo Nome e’ chiave secondaria in COMPAGNIE. Non ci sono altre chiavi secondarie. Si richiede di: 1. Progettare uno schema concettuale ad oggetti equivalente allo schema relazionale precedente, motivando le scelte effettuate. Lo schema deve contenere almeno un’aggregazione complessa (di tipo SET). Si stabilisca quali chiavi, primarie e secondarie, e’ ragionevole mantenere nel nuovo schema. 2. Tradurre lo schema concettuale in uno schema logico relazionale ad oggetti per Oracle, motivando le scelte effettuate. 3. Presentare gli statement di creazione della parte di schema logico relativa all’entita’ che contiene un campo che rappresenta un’aggregazione complessa utilizzando il sistema dei tipi di Oracle (si presentino solo le definizioni relative alla definizione dell’entita’ principale e dei tipi dei suoi attributi se tabelle annidate). 4. Supponendo che le tabelle contengano un certo numero di tuple, presentare gli statement per inserire nella base di dati le seguenti informazioni: o o e’ in scena un nuovo spettacolo con codice 12, in scena presso il Teatro della Corte dal 6 Aprile 2005 al 24 Aprile 2005, dal titolo “L’Illusione Comica”, di Pierre Corbeille, con regista Marco Sciaccaluga,; l’attore principale (si vuole inserire solo questo) e’ Eros Pagni. 5. Presentare gli statement SQL per Oracle per le seguenti operazioni: o Determinare gli spettacoli in scena presso i teatri periferici (cap > 16100) dal 3 Maggio al 3 Giugno. Restituire il nome del teatro, insieme al suo indirizzo nella forma Via, Numero, Cap, e il titolo dello spettacolo. o Determinare nome e cognome degli attori/registi che hanno partecipato allo spettacolo con titolo “L’Avaro”, in scena presso il Teatro della Corte, a partire dal 10/12/04. o Determinare per ogni teatro il numero di attori che hanno preso parte a spettacoli in scena presso quel teatro nel 2004. 2 o Inserire un nuovo attore L’attore si chiama Andrea Nicolini, ha codice 20 e lavora per la compagnia del “Teatro Stabile di Genova”. Associare quindi tale attore allo spettacolo inserito al punto 4. 3 Tipi in Oracle CREATE TYPE Nome AS OBJECT ( Dichiarazioni_attributi) [FINAL | NOT FINAL]; CREATE TYPE Nome UNDER Nome_superclasse ( Dichiarazioni_attributi) [FINAL | NOT FINAL]; Default: NOT FINAL CREATE TYPE Nome AS TABLE OF Tipo; CREATE TYPE Nome AS VARRAY(Numero) OF Tipo; CREATE TABLE Nome OF Nome_Tipo [({Vincoli chiave primaria, chiave esterna, not null, su campi nel tipo | SCOPE FOR NomeCampoREF is NomeTabella})] [NESTED TABLE NomeCampoNested STORE AS NomeTabella]; CREATE TABLE Nome (Dichiarazioni_attributi) [NESTED TABLE NomeCampoNested STORE AS NomeTabellaStorage]; con NomeCampoNested: nome del campo della tabella di tipo TABLE. NomeTabellaStorage: nome tabella utilizzata per la memorizzazione della tabella nested. I tipi utilizzati in Dichiarazioni_attributi possono essere: Tipi atomici Tipi definiti dall’utente REF Nome [SCOPE IS Nome_tabella] La clausola SCOPE IS puo’ essere inserita solo negli statement di CREATE TABLE. La clausola puo’ anche essere aggiunta ai campi delle tabelle tipate (SCOPE FOR). Funzioni OR in Oracle ref( ): dato un oggetto di un certo tipo, restituisce l’identificatore per quell’oggetto deref( ): dato un identificatore, restituisce l’oggetto puntato value( ): prende un alias di relazione e restituisce l’oggetto tupla associato (utilizzando il costruttore opportuno) TABLE( ): data una valori di tipo collezione, restituisce la tabella corrispondente al contenuto di tale valore. Trigger SQL-99 CREATE TRIGGER Nome {BEFORE|AFTER} Evento ON Relazione [REFERENCING {OLD AS Var | NEW AS Var | OLD AS Var | NEW AS Var}] [FOR EACH {ROW | STATEMENT}] [WHEN Condizione ] Comandi SQL con Evento: INSERT, DELETE, UPDATE [OF Lista Attributi] Condizione: clausola WHERE SQL Se l’azione comprende piu’ di un comando: BEGIN ATOMIC … END; 4