create table Corso (
  Codice    varchar2(10) 	not null,
  Nome      varchar2(40) 	not null,
  primary key(Codice))
TABLESPACE USERS
STORAGE (INITIAL 8K NEXT 4K PCTINCREASE 0);

create table Studente (
  Matricola varchar2(10) 	primary key,
  Nome      varchar2(15) 	not null,
  Cognome   varchar2(25) 	not null)
TABLESPACE USERS
STORAGE (INITIAL 8K NEXT 4K PCTINCREASE 0);

REM Indizione e` inglobata in Appello.
REM L'attributo Corso appena aggiunto non deve essere UNIQUE, perche` la relazione e` (1,N).
REM L'attributo Corso e` not null perche` e` a partecipazione obbligatoria. 

create table Appello (
  Corso        varchar2(10) 	not null,
  DataEsame    date 		not null,
  primary key (Corso,DataEsame),
  foreign key (Corso) references Corso (Codice))
TABLESPACE USERS
STORAGE (INITIAL 8K NEXT 4K PCTINCREASE 0);

create table Prenotazione (
  Studente         varchar2(10) 	not null,
  AppelloCorso     varchar2(10) 	not null,
  AppelloDataEsame date 		not null,
  Data		   date,
  primary key(Studente,AppelloCorso,AppelloDataEsame),
  foreign key (Studente) references Studente(Matricola),
  foreign key (AppelloCorso,AppelloDataEsame) 
  		references Appello(Corso,DataEsame),
  check(Data <= AppelloDataEsame))
TABLESPACE USERS
STORAGE (INITIAL 8K NEXT 4K PCTINCREASE 0);

insert into Corso    values ('A1', 'Analisi I');
insert into Corso    values ('A2', 'Analisi II');
insert into Corso    values ('BDS', 'Basi di dati - sperimentazioni');
insert into Corso    values ('BDF', 'Basi di dati - fondamenti');
insert into Corso    values ('LF', 'Linguaggi formali');
insert into Corso    values ('PRG', 'Programmazione');
insert into Corso    values ('IUM', 'Interazione uomo macchina');

insert into Studente (Matricola, Nome, Cognome) values ('99000', 'Silvio', 'Berlusconi');
insert into Studente (Nome, Cognome, Matricola) values ('Francesco', 'Rutelli', '99001');
insert into Studente values ('99002', 'Gianfranco', 'Fini');
insert into Studente values ('99003', 'Rocco', 'Buttiglione');
insert into Studente values ('00001', 'Ferdinando', 'Casini');
insert into Studente values ('00002', 'Rosy', 'Bindi');
insert into Studente values ('00005', 'Enrico', 'Berlinguer');
insert into Studente values ('98005', 'Marco', 'Taradash');
insert into Studente values ('98002', 'Marco', 'Pannella');
insert into Studente values ('99005', 'Livia', 'Turco');

insert into Appello values ('A2' , '04-DEC-01');
insert into Appello values ('LF' , '27-JUL-01');
insert into Appello values ('LF' , '04-DEC-01');
insert into Appello values ('BDF', '04-DEC-01');
insert into Appello values ('BDF', '18-JAN-02');
insert into Appello values ('BDF', '18-MAR-02');

insert into Prenotazione values ('99000','BDF' ,'04-DEC-01','03-NOV-01');
insert into Prenotazione values ('99000','BDF' ,'18-JAN-02','15-JAN-02');
insert into Prenotazione values ('99001','BDF' ,'18-MAR-02','10-FEB-02');
insert into Prenotazione values ('99003','A2'  ,'04-DEC-01','03-NOV-01');
insert into Prenotazione values ('99003','LF'  ,'04-DEC-01','10-NOV-01');
insert into Prenotazione values ('99003','BDF' ,'18-MAR-02','20-JAN-02');
REM------------- creo dei valori NULL in prenotazione:
REM------------- dico che non conosco la data di prenotazione.
REM------------- NOTA: non violo il vincolo in Prenotazione!
update prenotazione set Data=NULL where Studente='99003';

