Nella relazione CINEMA, Nome è chiave secondaria. Nella relazione FILM, CodRegista, e CodProtagonista sono chiavi esterne sulla tabella PERSONE.



Documenti analoghi
MEZZI CodM Tipo Targa AnnoI Assicurato

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

DBMS (Data Base Management System)

Il linguaggio SQL: trigger. Versione elettronica: 04.7.SQL.trigger.pdf

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Basi di Dati 1 Prof. L. Tanca e F. A. Schreiber APPELLO DEL 9 SETTEMBRE 2015 Tempo: 2h30m

Il linguaggio SQL. è di fatto lo standard tra i linguaggi per la gestione di data base relazionali.

Volumi di riferimento

Il Modello Relazionale

Lezione 8. Metadati, Viste e Trigger

Definizione di domini

PL/SQL PL/SQL. Ordine degli elementi dei triggers di Oracle. Differenze nei triggers. Versione dei trigger e PSM di Oracle

Abilità Informatiche A.A. 2010/2011 Lezione 9: Query Maschere Report. Facoltà di Lingue e Letterature Straniere

SQL: concetti base SQL. Definizione dei dati in SQL. SQL: "storia"

Istruzioni DML di SQL

Corso di Basi di Dati A.A. 2014/2015

UNIVERSITÀ DEGLI STUDI DI UDINE Facoltà di Medicina e Chirurgia CORSO DI LAUREA IN TECNICHE DI RADIOLOGIA MEDICA PER IMMAGINI E RADIOTERAPIA ESAME

Azioni. Select e join non consentono di modificare il contenuto del DB. Inserzione di nuovi dati. Azioni desiderate. Aggiornamento di dati

Lezione V. Aula Multimediale - sabato 29/03/2008

Basi di Dati: Corso di laboratorio

IL DAT A B A S E DI ALGE B R A N D O

Data management a.a Il linguaggio SQL

Corso sul linguaggio SQL

INFORMATICA PER L IMPRESA (Docente Prof. Alfredo Garro) ESERCIZIO 3

Tipi MULTISET: accesso

Corso Sistemi Informativi Avanzati. Programma 30 set Installazione Macchina Virtuale. Introduzione alla BI nelle Aziende.

Nozione ed uso. Operazioni eseguite automaticamente ogni volta che avviene un certo evento Uso:

Basi di Dati Corso di Laura in Informatica Umanistica

Si formulino le seguenti interrogazioni tramite il linguaggio SQL:

Basi di dati 9 febbraio 2010 Compito A

ESAME di INFORMATICA e ARCHIVIAZIONE

Vincoli di Integrità Approccio dichiarativo alla loro implementazione

Informatica per le discipline umanistiche 2 lezione 10

Esercitazione 8 Mercoledì 21 gennaio 2015 (2 ore) DDL e progettazione

Concetti fondamentali dei database database Cos'è un database Principali database

Linguaggio SQL: fondamenti D B M G. Gestione delle tabelle

Operazioni sui database

Basi di Dati e Microsoft Access

Giovanna Rosone 04/03/ /03/2010 SQL, Istruzioni per la modifica dello schema

SQL non è solo un linguaggio di interrogazione (Query Language), ma. Un linguaggio per la definizione di basi di dati (Data-definition language (DDL))

Compito Basi di Dati. Tempo concesso: 90 minuti 08 Giugno 2006 Nome: Cognome: Matricola:

Prova Scritta di Basi di Dati

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7. Il trattamento dei dati

COGNOME MATRICOLA. Con vincoli di integrita referenziale: INTERVENTO.CodTecnico à TECNICO.Codice INTERVENTO.MatCaldaia à CALDAIA.

SQL. Alcune note sulla definizione dei dati

Capitolo 7. Esercizio 7.1

Il BACKUP è disponibile in

Soluzione dell esercizio del 2 Febbraio 2004

2104 volume III Programmazione

Basi di Dati 1 Prof. L. Tanca e F. A. Schreiber APPELLO DEL 21 LUGLIO 2015 Tempo: 2h30m

1. Schema concettuale della base di dati Lo schema concettuale (o statico) è uno dei due schemi del progetto concettuale di un sistema informativo.

Basi di Dati Prof. L. Tanca e F. A. Schreiber APPELLO DEL 12 FEBBRAIO 2015 PARTE 1

Laboratorio di Basi di Dati e Web

Esercizio data base "Biblioteca"

SQL. Linguaggio di interrogazione per basi di dati relazionali. Relazione = tabella con attributi (a 1, a 2,, a n ): Funzionalità principali di SQL:

marca (1,n) (1,1) nome prezzou prodotto nome responsabile quantità nome datai dataf (0,n) vendite (0,n) (0,n) (0,n) tempo acquisti quantità (0,n)

I database relazionali sono il tipo di database attualmente piu diffuso. I motivi di questo successo sono fondamentalmente due:

Progettare una base di dati che permetta di gestire il problema descritto nel seguito, nei seguenti punti:

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino

Linguaggio SQL. Structured Query Language

Basi di dati. Il Modello Relazionale dei Dati. K. Donno - Il Modello Relazionale dei Dati

SQL SQL. Definizione dei dati. Domini. Esistono 6 domini elementari:

Corso di Laboratorio di Basi di Dati

Organizzazione degli archivi

Informatica Generale Andrea Corradini Sistemi di Gestione delle Basi di Dati

Introduzione alla teoria dei database relazionali. Come progettare un database

a.a. 2012/13 12 Novembre 2012 Preparazione al Test in itinere, Compito A 1. Modellare tramite uno schema entità- relazione la seguente base di dati:

Progettazione di Basi di Dati

Database 1 biblioteca universitaria. Testo del quesito

SQL PER LA DEFINIZIONE DI BASI DI DATI

Progettaz. e sviluppo Data Base

Una metodologia di progettazione di applicazioni web centrate sui dati

PROGRAMMA DI CLASSE 5AI

INDICI. Prevediamo di effettuare spesso interrogazioni simili alle seguenti:

Il seguente esempio ha lo scopo di illustrare i 3 tipi di relazione 1:1,1:N,N:N. Tabella Conto: Tabella Conto:

MySQL Database Management System

TRIGGER Regole Attive (Trigger) OLD_TABLE NEW_TABLE old new

Vincoli e Triggers. Vincoli. Tipo di vincoli. Chiavi esterne

Prova scritta. Mercoledì 11 Febbraio Appello di Informatica II - Corso di Laurea in Ottica e Optometria A.A. 2007/2008

CONCETTO DI ANNIDAMENTO

SQL e ACCESS. Modello relazionale PROBLEMA ENTITA STUDENTE

Introduzione a MySQL

Esame di Stato Istituto Tecnico Industriale Soluzione della Seconda Prova Indirizzo: INFORMATICA Tema: INFORMATICA Anno Scolastico:

Database 3 affitto veicoli. Testo del quesito

I DATABASE Database relazionale

Esercitazione 1. Sistemi Informativi T. Versione elettronica: L01.2.DDLDMLbase.pdf

SQL: definizione schema

Tecnologia di un Database Server (centralizzato) Introduzione generale

Dispensa di database Access

BASI DI DATI - : I modelli di database

Vincoli di Integrità

Uso delle basi di dati DBMS. Cos è un database. DataBase. Esempi di database

Progettazione di Database. Un Esempio

Triggers. Basi dati attive. Trigger. Indipendenza della conoscenza

Esame di stato 2004 Portfolio studente

Il linguaggio SQL: query innestate

SISTEMI INFORMATIVI AVANZATI -2010/ Introduzione

Il Modello Relazionale

Gestione delle tabelle

Transcript:

Si consideri il seguente schema relazionale, relaivo ad una base di dati per gestire la programmazione cinematografica giornaliera in un certo insieme di cinema: CINEMA(CodC, Nome, Indirizzo, Tel, NSale) SALE(CodS, Nome, Nposti, CodC) FILM(CodF, Titolo, CodRegista, CodProtagonista, Durata) PERSONE(CodA, Nome, Cognome) ATTORI(CodA, CodF) PROIEZIONI(CodS, OraInizio, CodF) Nella relazione CINEMA, Nome è chiave secondaria. Nella relazione FILM, CodRegista, e CodProtagonista sono chiavi esterne sulla tabella PERSONE. Si richiede di: a. progettare uno schema concettuale ad oggetti per il dominio applicativo precedente, motivando le scelte effettuate. Si assuma che le tabelle non abbiano chiavi secondarie. Si richiede di dare un nome ad entrambi i traversal path delle associazioni tra classi. b. Specificare le classi utilizzando il linguaggio ODL c. Rispondere alle seguente interrogazioni sullo schema progettato utilizzando il linguaggio OQL: a. Trovare il nome delle sale del cinema Augustus. b. Determinare le proiezioni (ore inizio e titolo film) delle sale con almeno 100 posti. c. Determinare i titoli dei film con attore Brad Pitt. d. Determinare i titoli dei film con attore Brad Pitt in cui Brad Pitt non è protagonista. e. Determinare per ogni sala del cinema Augustus il numero totale di film proiettati giornalmente. f. Trovare nome e cognome degli attori che hanno recitato il film diretti da Roberto Benigni. g. Per ogni cinema, restituire il suo nome e i nomi delle sale che contiene h. Restituire tutti i nomi di sale dei cinema con più di 100 posti. i. Per ogni film restituire il suo titolo e il numero di attori che hanno lavorato in quel film. j. Restituire l insieme dei registi di film con durata superiore alle 2 ore. d. A partire dalla schema ad oggetti realizzato al punto 1, si richiedere di definire uno schema ad oggetti in cui le associazioni sono modellate attraverso attributi. Non si rappresentino sempre le associazioni con le loro inverse, ma si faccia una scelta in base alle operazioni che effettueranno sullo schema (le operazioni da tenere in considerazione sono le interrogazioni al punto c). e. A partire dallo schema al punto (d), presentare gli statement di creazione dello schema logico, utilizzando Oracle. f. Scrivere in SQL, le interrogazioni del punto (c) ed effettuare le seguenti nuove operazioni: k. Supponendo che le tabelle siano popolate, presentare gli statement per inserire nella base di dati due nuove proiezioni per la sala identificata dal codice S3, con ora di inizio 18, per il film di codice f1, e con ora di inizio 22 per il film con codice f2. g. Si supponga di voler garantire i seguenti vincoli di integrita : a. Mantenere aggiornato il campo NSale della tabella CINEMA, a fronte di inserimenti e cancellazioni dalla tabella SALE. b. Supponete di avere la tabella PROIEZ (NumFilm) che contiene la quantita totale di film proiettati. Si vuole aggiornare automaticamente questa tabella. c. Si vuole garantire il seguente vincolo di integrita : Non si vuole inserire una nuova proiezione di un film in una sala, se in quella sala quel film viene gia proiettato. d. Quando si inserisce un nuovo film, aggiungere come attore del film il protagonista. e. Quando si inserisce una nuova sala in un cinema C, se il numero dei posti e NULL, assegnare a tale campo il numero minimo di posti delle sale del cinema C.

1. Schema ad oggetti CINEMA CodC:String Nome: String Indirizzo: String Tel: String NSale: Integer contiene 1..* Contiene in SALA 1 CodS:String Nome:String NPosti: Integer proietta 1..* lasala ilfilm PROIEZIONE OraInizio: Decimal(4,2) 0..* PERSONA CodA:String Nome: String Cognome: String dirige recita 0..* Diretto recita regista proiettatoin 1 1..* FILM CodF:String troup Titolo: String 1..* durata: Decimal(2,1) 0..* 1 Protagonista starin Protagonista Figura 1. Schema concettuale ad oggetti A partire dalla schema relazione proposto dal testo, si sono individuate le quattro entità/classi: Cinema, Sala, Film, Persona. Dopodiché si è individuata una associazione binaria tra Sala e Film con un attributo (OraInizio). Inoltre, si è inserito nelle classi i nomi di attributi con i relativi tipi. Si noti che per le associazioni è stato riportato sia il nome della associazione che i nomi dei traversal path. 2. Rappresentazione dello schema ad oggetti in OQL A partire dal diagramma di Figura 1 si definiscono i seguenti statement di creazione delle classi e delle associazioni che esistono tra di loro. Class Cinema (extent Cinemas key CodC) { attribute string CodC; attribute string Nome; attribute string Indirizzo; attribute string Tel; attribute integer NSale; relationship Set<Sala> contiene inverse Sala::in; }

Class Sala (extent Sale key CodS) { attribute string CodS; attribute string Nome; attribute integer NPosti; relationship Cinema in inverse Cinema::contiene; relationship set<proiezione> proietta inverse Proiezione::inSala; } Class Proiezione (extent Proiezioni key (OraInizio,inSala)) { attribute integer OraInizio; } relationship Sala insala inverse Sala::proietta; relationship Film ilfilm inverse Film::proiettato; Class Film (extent Films key CodF) { attribute string CodF; attribute string Titolo; attribute integer Durata; } relationship set<proiezione> proiettato inverse Proiezione::ilFilm; relationship Persona regista inverse Persona::dirige; relationship Persona protagonista inverse Persona::starIn; relationship set<persona> troup inverse Persona::recita; Class Persona (extent Persone key CodA) { attribute string CodA; attribute string Nome; attribute string Cognome; } relationship Film dirige inverse Film::regista; relationship Film starin inverse Film::protagonista; relationship set<film> recita inverse Film::troup; 3. Risposte alle interrogazione a. Trovare il nome delle sale del cinema Augustus. SELECT s.nome FROM Sale s WHERE s.in.nome = Augustus b. Determinare le proiezioni (ore inizio e titolo film) delle sale con almeno 100 posti. SELECT p.orainizio, p.ilfim.titolo FROM Proiezioni p WHERE p.insala.nposti >= 100

c. Determinare i titoli dei film con attore Brad Pitt. SELECT f.titolo FROM Persone p, p.recita f WHERE p.cognome = Pitt and p.nome = Brad d. Determinare i titoli dei film con attore Brad Pitt in cui Brad Pitt non è protagonista. SELECT f.titolo FROM Persone p, p.recita f WHERE p.cognome = Pitt and p.nome = Brad and f NOT IN p.starin --- soluzione alternativa ----------------------------- and f.primoattore!= p --- N.B.: quest ultima soluzione è da preferire perché molto più efficiente e. Determinare per ogni sala del cinema Augustus il numero totale di film proiettati giornalmente. SELECT s.nome, COUNT(s.proietta) FROM Sale s WHERE s.in.nome = Augustus f. Trovare nome e cognome degli attori che hanno recitato il film diretti da Roberto Benigni. SELECT DISTINCT t.cognome, t.nome FROM Film f, f.troup t WHERE f.regista IN (SELECT p FROM Persone p WHERE p.cognome= Benigni and p.nome= Roberto ) --- oppure --- f.regista.cognome= Benigni and f.regista.nome= Roberto -- N.B.: quest ultima soluzione è da preferire perché molto più efficiente g. Per ogni cinema, restituire il suo nome e i nomi delle sale che contiene SELECT struct(cinema: c.nome, sale: (SELECT s.nome FROM Sale s WHERE s.in=c) FROM Cinema c h. Restituire tutti i nomi di sale dei cinema con più di 100 posti. SELECT DISTINCT s.nome FROM Sale s WHERE s.nposti > 100 i. Per ogni film restituire il suo titolo e il numero di attori che hanno lavorato in quel film. SELECT f.titolo, COUNT(f.troup) FROM Film f j. Restituire l insieme dei registi di film con durata superiore alle 2 ore. SELECT DISTINCT f.regista FROM Film f WHERE f.durata > 2

CINEMA CodC:String Nome: String Indirizzo: String Tel: String NSale: Integer 1..* Contiene in SALA 1 CodS:String Nome:String NPosti: Integer 1..* lasala ilfilm PROIEZIONE OraInizio: Decimal(4,2) Diretto regista 0..* PERSONA CodA:String Nome: String Cognome: String 0..* recita 1 1..* FILM CodF:String troup Titolo: String 1..* durata: Decimal(2,1) 0..* 1 Protagonista Protagonista Figura 2. Schema logico ad oggetti (con scelta dei traversal paths) 4. Passaggio dallo schema concettuale ad oggetti allo schema logico relazionale ad oggetti Una volta definito lo schema concettuale ad oggetti, è possibile ottenere uno schema logico relazionale ad oggetti, effettuando i seguenti passi: 1. Identificare i traversal paths che si vogliono mantenere nel modello relazionale ad oggetti. Nel modello relazionale ad oggetti non esistono le relationships del modello ad oggetti. Per cui le associazioni devono essere modellate attraverso attributi. Questo comporta che mantenere entrambi i traversal paths e costoso (bisogna garantire l integrita referenziale), per cui si sceglie di mantenerne uno solo (quello che risulta piu comodo in base al tipo di operazioni interrogazioni -- che si vogliono effettuare sulla base di dati). In Figura 2 viene riportato lo schema concettuale presentato in Figura 1 in cui vengono mantenuti solo i traversal path che ci si aspetta di trovare nel modello relazionale ad oggetti. Questi traversal path permettono di rendere piu efficienti la maggior parte delle interrogazioni previste per la base di dati. 2. Stabilire quali classi del modello ad oggetti (oppure quali entita nel modello ER) devono essere rappresentate a. come relazioni oppure b. come tipi oggetto ed, eventualmente, come relazioni tipate. Come detto a lezione, ci possono essere vari motivi che influenzano questa scelta. La presenza di metodi in una classe o di sue sottoclassi porta a modellare una classe come tipo oggetto. Un altro motivo per modellare una classe come tipo oggetto e il fatto che la classe e puntata da un traversal path. Negli altri casi e possibile modellare una classe come una relazione. Si noti infine che sebbene una classe possa essere modellata come un tipo oggetto, questo non implica che venga poi creata una relazione di tale tipo (relazione tipata). La relazione tipata viene creata qualora la classe nel modello concettuale e rilevante indipendentemente dalle classi che la puntano. Utilizzando una terminologia object-oriented, questo vuol dire che la classe e un entry-point per la formulazione delle interrogazioni (cioe si e interessati a recuperare informazioni a partire da tale classe).

Nella tabella in Figura 3, per ogni classe viene presentata la relativa rappresentazione del modello relazionale ad oggetti. La classe puo essere rappresentata come una relazione, oppure come un tipo. Inolte a partire dal tipo e possibile creare una relazione per contenere gli oggetti di quel tipo (relazione tipata). Nell ultima colonna della tabella vengono riportati gli attributi di tipo oggetto dichiarati nella relazione/tipo/relazione tipata corrispondente. Si noti che, a parte la classe Cinema il cui trattamento viene discusso di seguito--, le classi sono rappresentate attraverso tipi perche vengono riferite da altre classi dello schema. Classe Relazione Tipo Relazione Attributi di tipo oggetto Tipata Cinema Cinema (Nota 1) Sala Tsala Sale Proiezione Tproiezione (Nota 2) proiezioni insala REF Tsala ilfilm REF Tsala Persona Tpersona persone Film Tfilm film protagonista REF Tpersona regista REF Tpersona troup Tattori Tattori (TABLE OF REF Tpersona) Figura 3. Mappatura dal modello concettuale ad oggetti al modello logico relazionale ad oggetti Nota 1: La classe Sala punta la classe Cinema. Per cui in questo caso, la classe Cinema poteva essere modellata come tipo oggetto e poi creata una relazione tipata. Dal momento pero che c e una sola classe che riferisce la classe cinema, in questo caso si e deciso di modellare cinema come una relazione e di realizzare il riferimento da parte della classe Sala inserendo un costraint di integrita referenziale tipico del modello relazione puro. Questa e una scelta molto opinabile. Ad ogni modo, permette di mettere in evidenza che il meccanismo di integrita referenziale nel modello relazionale puro, e totalmente supportato nel modello relazionale ad oggetti. Nota 2: Anche la scelta di modellare le proiezioni come tipo oggetto e opinabile. In questo caso si poteva modellare come una relazione perche la classe proiezione punta due classi (Sala e Film) ma non viene puntata da nessuna classe. 3. Statement Oracle per la creazione dello schema A partire dalla mappatura riportata in Figura 3 e possibile derivare i seguenti statement Oracle per la definizioni della schema relazionale ad oggetti. create table cinema( CodC varchar(5) PRIMARY KEY, Nome varchar(10) NOT NULL, Indirizzo varchar(20), Tel varchar(10), NSale integer ); create type Tsala as OBJECT ( CodS varchar(5), Nome varchar(10), Nposti integer, incinema varchar(5) );

create table sala of tsala ( PRIMARY KEY(CodS), CONSTRAINT cinema_fk FOREIGN KEY (incinema) REFERENCES cinema(codc) ); create type Tpersona AS OBJECT( CodP varchar(5), Nome varchar(10), Cognome varchar(10) ); create table persona of tpersona (PRIMARY KEY(CodP)); CREATE TYPE Tattori as TABLE OF REF Tpersona; create type TFilm AS OBJECT( CodF varchar(5), Titolo varchar(10), Durata integer, troup Tattori, protagonista REF TPersona, regista REF TPersona ); create table Film of TFilm( PRIMARY KEY(CodF) ) NESTED TABLE troup STORE AS troup_tab; create type Tproiezioni AS OBJECT ( insala REF Tsala, ilfilm REF Tfilm, orainizio integer ); create table Proiezioni of Tproiezioni; 4. Statement Oracle per la popolazione dello schema Lo schema realizzato al passo precedente puo essere popolato utilizzando i seguenti comandi del DML di Oracle. insert into cinema values ('c100','augustus','via Pioppi, 35','0103536638',3); insert into cinema values ('c200','universal','via Mazzini, 38','0103536699',1); insert into sala values ('s1','gala',100,'c100'); insert into sala values ('s2','trionfo',90,'c100'); insert into sala values ('s3','platea',110,'c100'); insert into sala values ('s4','gala',100,'c200'); insert into persona values ('p1','roberto','benigni'); insert into persona values ('p2','brad','pitt'); insert into persona values ('p3','sharon','stone'); insert into persona values ('p4','sabrina','ferilli'); insert into persona values ('p5','wolfgang','petersen'); insert into persona values ('p6','julian','glover'); insert into persona values ('p7','diane','kruger'); insert into persona values ('p8','nicoletta','braschi'); insert into persona values ('p9','giorgio','cantarini');

insert into film values('f1','la vita e''', 2,tattori(), NULL, NULL); update film set protagonista= (select ref(p) from persona p where p.cognome='benigni') where codf='f1'; update film set regista= (select ref(p) from persona p where p.cognome='benigni') where codf='f1'; insert into table(select troup from film where codf='f1') select ref(p) from persona p where p.codp IN ('p1','p8','p9'); insert into film values('f2','troy', 1,tattori(), NULL, NULL); update film set protagonista= (select ref(p) from persona p where p.cognome='pitt') where codf='f2'; update film set regista= (select ref(p) from persona p where p.cognome='petersen') where codf='f2'; insert into table(select troup from film where codf='f2') select ref(p) from persona p where p.codp IN ('p2','p6','p7'); select ref(s), ref(f), 10 where f.codf='f1' and s.cods='s1'; select ref(s), ref(f), 12 where f.codf='f1' and s.cods='s1'; select ref(s), ref(f), 20 where f.codf='f1' and s.cods='s1'; select ref(s), ref(f), 10 where f.codf='f1' and s.cods='s4'; select ref(s), ref(f), 12 where f.codf='f1' and s.cods='s4'; select ref(s), ref(f), 20 where f.codf='f1' and s.cods='s4'; select ref(s), ref(f), 10 where f.codf='f2' and s.cods='s3'; select ref(s), ref(f), 12 where f.codf='f2' and s.cods='s3';

select ref(s), ref(f), 20 where f.codf='f2' and s.cods='s3'; 5. Semplici interrogazioni SQL Rispondere alle seguente interrogazioni sullo schema progettato utilizzando il linguaggio SQL di Oracle: a. Trovare il nome delle sale del cinema Augustus. SELECT s.nome FROM Sala s, Cinema c WHERE s.incinema=c.codc AND c.nome = 'Augustus'; N.B. Questo tipo di interrogazione deriva dalla scelta effettuata in fase di passaggio dal modello concettuale a quello logico. b. Determinare le proiezioni (ore inizio e titolo film) delle sale con almeno 100 posti. SELECT p.orainizio, p.ilfilm.titolo FROM Proiezioni p WHERE p.insala.nposti >= 100; c. Determinare i titoli dei film con attore Brad Pitt. SELECT DISTINCT f.titolo FROM Film f, TABLE(f.Troup) t WHERE value(t).cognome = 'Pitt' and value(t).nome = 'Brad'; d. Determinare i titoli dei film con attore Brad Pitt in cui Brad Pitt non è protagonista. SELECT f.titolo FROM Film f WHERE f.protagonista.cognome!= 'Pitt' and f.protagonista.nome!= 'Brad' and EXISTS (select p from TABLE(f.Troup) p where value(p).cognome='pitt' AND value(p).nome='brad'); e. Determinare per ogni sala del cinema Augustus il numero totale di film proiettati giornalmente. SELECT p.insala.nome, COUNT(*) FROM Proiezioni p, Cinema c WHERE c.codc=p.insala.incinema AND c.nome='augustus' GROUP BY p.insala.nome; f. Trovare nome e cognome degli attori che hanno recitato il film diretti da Roberto Benigni. SELECT DISTINCT value(t).cognome, value(t).nome FROM Film f, TABLE(f.troup) t WHERE f.regista.cognome='benigni' and f.regista.nome='roberto';

g. Per ogni cinema, restituire il suo nome e i nomi delle sale che contiene SELECT c.nome, s.nome FROM Cinema c, Sala s WHERE c.codc=s.incinema; h. Restituire tutti i nomi di sale dei cinema con più di 100 posti. SELECT DISTINCT s.nome FROM Sala s WHERE s.nposti > 100; i. Per ogni film restituire il suo titolo e il numero di attori che hanno lavorato in quel film. SELECT f.titolo, COUNT(*) FROM Film f, TABLE(f.troup) GROUP BY f.titolo; j. Restituire l insieme dei registi di film con durata superiore alle 2 ore. SELECT deref(f.regista) FROM Film f WHERE f.durata > 2; k. Supponendo che le tabelle contengano un certo numero di tuple, presentare gli statement per inserire nella base di dati due nuove proiezioni per la sala identificata dal codice S3, con ora di inizio 18, per il film di codice f1, e con ora di inizio 22 per il film con codice f2. select ref(s), ref(f), 18 where f.codf='f1' and s.cods='s3'; select ref(s), ref(f), 22 where f.codf='f2' and s.cods='s3';

6. Triggers Si supponga di voler garantire i seguenti vincoli di integrita : f. Mantenere aggiornato il campo NSale della tabella CINEMA, a fronte di modifiche della tabella SALE. -- versione in oracle funzionante CREATE OR REPLACE TRIGGER Aggiorna_NumSale AFTER UPDATE OF incinema OR DELETE OR INSERT ON Sala FOR EACH ROW begin IF UPDATING THEN UPDATE Cinema t SET NSale = NSale - 1 WHERE :old.incinema=t.codc; UPDATE Cinema t SET NSale = NSale + 1 WHERE :new.incinema=t.codc; END IF; IF DELETING THEN UPDATE Cinema t SET NSale = NSale - 1 WHERE :old.incinema=t.codc; END IF; IF INSERTING THEN UPDATE Cinema t SET NSale = NSale + 1 WHERE :new.incinema=t.codc; END IF; end; g. Supponete di avere la tabella PROIEZ(NumFilm) che contiene la quantita di film proiettati. Si vuole aggiornare automaticamente questa tabella. -- questi trigger sono espressi in SQL-99 perche in Oracle non e possibile far -- riferimento a una tabella (solo a ROW) CREATE TRIGGER Aggiorna_Proiez AFTER INSERT ON Proiezioni REFERENCING NEW TABLE AS New FOR EACH STATEMENT UPDATE Proiez SET NumFilm = NumFilm + SELECT COUNT(*) FROM New; CREATE TRIGGER Aggiorna_Proiez AFTER DELETE ON Proiezioni REFERENCING OLD TABLE AS Old FOR EACH STATEMENT UPDATE Proiez SET NumFilm = NumFilm - SELECT COUNT(*) FROM Old;

h. Si vuole garantire il seguente vincolo di integrita : Non si vuole inserire una nuova proiezione di un film in una sala, se in quella sala quel film viene gia proiettato. i. Quando si inserisce un nuovo film, aggiungere come attore del film il protagonista. Quando si inserisce una nuova sala in un cinema C, se il numero dei posti e NULL, assegnare a tale campo il numero minimo di posti delle sale del cinema C.