|
Appunti informatica |
|
Visite: 6092 | Gradito: | [ Grande appunti ] |
Leggi anche appunti:DatabaseDatabase Il database viene usato fortemente nelle imprese per gestire le I Database RelazionaliI Database Relazionali allora cosa sono questi famigerati Database relazionali? il I Database RelazionaliI Database Relazionali allora cosa sono questi famigerati Database relazionali? |
In questa fase l'interesse è volto all'analisi e alla ristrutturazione dei requisiti raccolti. Si giunge, in questo modo, ad un insieme omogeneo e non ambiguo di specifiche da utilizzare nella fase successiva che è quella della progettazione.
Il primo passo è stato quello di riorganizzare le specifiche, partizionandole in gruppi di frasi che si riferiscono ad informazioni omogenee. Inoltre si cerca di usare una terminologia opportuna, priva di ambiguità, facendo uso del glossario dei termini.
Al termine di questa fase, si ottengono le specifiche seguenti
Dati di carattere generale
Si vuole progettare il sistema informativo di un'agenzia turistica con diverse sedi. Diversi tipi di persone sono coinvolte: i clienti ed il personale dell'agenzia. |
Termine |
Descrizione |
Sinonimi |
Termini collegati |
Sede |
Sede dell'agenzia in esame. |
Filiale |
Dipendente. |
Dipendente |
Personale che lavora per l'agenzia turistica. |
|
Sede, Operatore, Impiegato. |
Impiegato |
Personale dell'agenzia che lavora come impiegato. |
|
Dipendente, Prenotazione. |
Operatore |
Personale dell'agenzia che lavora come operatore turistico. |
|
Dipendente, Offerta. |
Personale in loco |
Personale convenzionato con l'agenzia che affianca gli operatori in una data località. |
|
Località. |
Offerta |
Proposta di viaggio effettuata dall'agenzia e relativa ad una determinata località. |
|
Cliente, Località, Operatore. |
Località |
Luogo relativo ad una data offerta di viaggio. |
Destinazione |
Personale in loco, Offerta. |
Cliente |
Persona che prenota una data offerta di viaggio proposta da un'agenzia. |
|
Offerta. |
Tabella 1 : Glossario dei termini
Per la sede si vuole tener traccia del codice che la identifica, dell'indirizzo e dei recapiti telefonici. |
Dati sul Cliente
Per il cliente teniamo traccia di alcuni dati anagrafici, quali il nome, il cognome, l'età, l'indirizzo, il telefono ed il codice fiscale (che lo identifica). |
Dati sui Dipendenti
I dipendenti possono essere impiegati oppure possono lavorare sul campo come operatori. Dei dipendenti si vuole tener traccia delle usuali informazioni anagrafiche e di quelle relative al contratto di lavoro. |
Dati sugli Impiegati
Per gli impiegati si vuole tener traccia del tipo di impegno (part-time o full-time) e delle prenotazioni registrate. |
Dati sugli Operatori
Per gli operatori si vuole conservare l'informazione relativa alla mansione e alle offerte nel contesto delle quali lavorano. |
Dati sugli Personale in loco
Per il Personale in loco si vuole tener traccia dei dati anagrafici e della mansione. |
Dati sull' Offerta
Ogni offerta è contraddistinta da un codice (univoco solo rispetto alla località), dai dettagli, dal costo, dal numero di posti disponibili e dalla località di destinazione. |
Dati sulla Località
Per la località si deve tener traccia del codice identificativo, del nome della località, della regione e dello stato di appartenenza, di una breve descrizione delle attrattive e del fatto che sia o meno una località gettonata. |
Dopo aver completato la fase dell'analisi delle specifiche è possibile passare alla costruzione del modello concettuale della base dei dati. In questo modello tutti quei concetti che hanno un'esistenza autonoma sono rappresentati mediante le entità del modello E-R, mentre quei concetti che legano le entità individuate sono rappresentate mediante le relazioni del modello E-R.
Si parte da uno schema a scheletro che contiene i principali concetti dell'applicazione e poi si procede per raffinamenti successivi.
Figura 1: Schema scheletro del modello E-R
I concetti principali sono il Cliente, l'Offerta, la Località dell'offerta, il Dipendente, la Sede e l'Operatore in loco.
Tra queste entità esistono le relazioni di Prenotazione, di Destinazione, di Contratto, di Contesto lavoro e di Collocazione.
A partire dal seguente schema, mediante dei raffinamenti si ottiene il modello E-R.
IdOfferta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Figura 2: Schema del Modello E-R
ENTITA' |
DESCRIZIONE |
ATTRIBUTI |
IDENTIFICATORE |
Cliente |
Persona che richiede una prenotazione di un'offerta viaggio. |
CF, Nome, Cognome, Indirizzo, Recapito Telefonico. |
CF. |
Offerta |
Offerta di viaggio proposta dall'agenzia |
IdOfferta, Località, Dettaglio, Costo, Posti. |
IdOfferta, Località. |
Località |
Località di destinazione dell'offerta |
IdLocalità, Nome, Attrattive, Regione, Stato, Richiesta. |
IdLocalità. |
Dipendente |
Personale dipendente dell'agenzia. |
CF,Nome,Cognome, DataNascita,Indirizzo. |
CF. |
Impiegato |
Personale con ruolo di impiegato. |
Tipo. |
Vedi Dipendente |
Operatore |
Personale con ruolo di operatore turistico. |
Mansione. |
Vedi Dipendente |
Sede |
Sede dell'agenzia. |
Codice, Indirizzo, Telefono. |
Codice. |
Personale in loco |
Personale convenzionato che residente in una località turistica e che affianca gli operatori dipendenti in diverse mansioni |
CF, Nome, Cognome, Indirizzo, DataNascita, Mansione. |
CF. |
Tabella 2: Porzione del dizionario dati-Entità
Relazione |
Entità partecipanti |
Descrizione |
Attributi |
Destinazione |
Località (1,N) |
Associa ogni offerta ad una località. |
|
Prenotazione |
Cliente (1,N) Offerta (0,N) Impiegato (0,N) |
Associa ad un cliente l'offerta prenotata in una determinata data e con un anticipo sul costo e registrata da un impiegato. |
DataPrenotazione, Anticipo. |
Contratto |
Dipendente |
Ogni sede dell'agenzia ha del personale dipendente legato ad essa da un contratto. |
Data stipula, Stipendio. |
Collocazione |
Associa ad ogni località relativa ad un offerta di viaggio, il personale convenzionato, ivi residente. |
|
|
Contesto lavoro |
Operatore (1,N) Offerta (1,N) |
Associa a ciascun operatore una o più offerte nel contesto delle quali lavora |
|
Concetto |
Tipo |
Volume |
Sede |
E |
|
Offerte |
E |
|
Località |
E |
|
Dipendente |
E |
|
Operatore |
E |
|
Impiegato |
E |
|
Personale in loco |
E |
|
Cliente |
E |
|
Prenotazione |
R |
|
ContestoLavoro |
R |
|
Operazione |
Descrizione |
Frequenza |
Tipo |
O1 |
Inserimento di un nuovo cliente. |
200 al giorno |
OL |
O2 |
Inserimento di una nuova offerta di viaggio su data una località. |
5 al mese |
OL |
O3 |
Inserimento di un nuovo impiegato |
1 al mese |
OL |
O4 |
Ricerca di tutte le offerte relative ad una località. |
200 al giorno |
OL |
O5 |
Trovare gli operatori che sono anche impiegati. |
1 al mese |
OL |
O6 |
Ricerca dell'impiegato che ha registrato una data prenotazione. |
10 al mese |
OL |
O7 |
Ricerca della sede presso cui lavora un dipendente. |
1 al mese |
OL |
O8 |
Ricerca degli operatori convenzionati di una località turistica. |
10 volte al mese |
OL |
O9 |
Statistica sulle località più gettonate. |
2 volte all'anno |
B |
Per definire lo schema relazionale bisogna tradurre lo schema Entità-Relazione in modo da ottenere un insieme di relazioni. Prima di fare questo bisogna effettuare la ristrutturazione dello schema E-R.
Nel caso trattato bisogna risolvere la generalizzazione (totale e sovrapposta) e togliere gli attributi composti. La generalizzazione si trasforma in due relazioni uno ad uno che legano rispettivamente l'entità padre (Dipendente) con le due entità figlie (Impiegato ed Operatore).
Lo schema in basso è lo schema ristrutturato, in cui è stata risolta la generalizzazione e sono stati eliminati gli attributi composti.
Codice Sede Stipendio
|
|
|
|
|
Figura 3: Schema del Modello E-R ristrutturato
A questo punto bisogna tradurre in relazioni le associazioni insieme alle entità, presenti nello schema ristrutturato.
Le associazioni molti a molti vengono necessariamente tradotte in relazioni.
Nel caso esaminato ci sono due associazioni molti a molti come Prenotazione, che coinvolge le entità Cliente, Offerta e Impiegato e Contesto Lavoro che coinvolge le entità Offerta e Operatore.
Le associazioni restanti sono tutte associazioni uno a molti. In specifico abbiamo l'associazione Collocazione, che lega le entità Personale in loco e Località, Destinazione che lega Offerta e Località, Contratto che lega Dipendente con Sede e infine le associazioni R1 e R2, venute fuori dalla risoluzione della generalizzazione.
Ognuna di queste associazioni uno a molti può essere risolta introducendo, come nuovo attributo, in una delle relazioni, relative alle entità coinvolte, l'identificatore dell'altra entità.
Schema Relazionale
A valle del ragionamento si riporta lo schema relazione finale.
Cliente( CF, Nome, Cognome, Indirizzo, RecapitoTelefonico)
Località( IdLocalità, Nome, Regione, Stato, Attrattive, Richieta)
Offerta (IdOfferta, Località, Dettaglio, Costo, Posti)
Prenotazione (CF, IdOfferta, Località, Impiegato, DataPrenotazione, Anticipo)
Sede (Codice, Telefono, Indirizzo)
Dipendente (CF, Nome, Cognome, DataNascita, Indirizzo, Sede, DataContratto, Stipendio)
Impiegato (Dipendente, Tipo)
Operatore (Dipendente , Mansione)
ContestoLavoro (Operatore, Offerta, Località)
PersonaleInLoco (CF, Nome, Cognome, Indirizzo, DataNascita, Mansione, Località)
Per evidenziare i vincoli di integrità referenziale, è mostrato nella pagina seguente il cammino di join. Per ciascuna tabella vengono mostrati soltanto i campi che incorrono nei vincoli di integrità referenziale, le chiavi primarie sono in grassetto.
Figura 4: Cammino di Join
Implementazione fisica del DB su Oracle
Bisogna fare delle considerazioni che riguardano l'allocazione del tablespace per ciascuna tabella che sarà implementata in Oracle.
Per ciascuna tabella è stato considerato prima di tutto il volume iniziale cioè il numero di tuple presenti al momento della creazione della tabella stessa. Subito dopo è stato considerato il parametro intervallo di crescita in termini di numero di righe che saranno inserite nella tabella in un certo intervallo temporale. Infine bisogna precisare la frequenza delle attività di aggiornamento e di inserimento.
Ad esempio, se consideriamo la tabella Cliente, si parte da un numero iniziale di righe pari a 100.
Sono previsti 200 inserimenti al giorno, quindi l'attività di inserimento ha una frequenza alta, mentre quella di aggiornamento ha una frequenza bassa.
Le stesse considerazioni sono state fatte per le altre tabelle.
CREAZIONE DELLE TABELLE
CREATE TABLE 'TEMPES06'.'CLIENTE' ('CF' VARCHAR2(20 byte) NOT NULL,
'NOME' VARCHAR2(50 byte) NOT NULL,
'COGNOME' VARCHAR2(50 byte) NOT NULL,
'INDIRIZZO' VARCHAR2(100 byte) NOT NULL,
'TELEFONO' VARCHAR2(15 byte),
CONSTRAINT 'PK_CLIENTE' PRIMARY KEY('CF') USING INDEX
TABLESPACE 'USERS'
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 24K NEXT 0K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0)
LOGGING ;
CREATE TABLE 'TEMPES06'.'LOCALITA' ('IDLOCALITA' VARCHAR2(20 byte) NOT NULL,
'NOME' VARCHAR2(50 byte) NOT NULL,
'REGIONE' VARCHAR2(50 byte),
'STATO' VARCHAR2(50 byte) NOT NULL,
'ATTRATTIVE' VARCHAR2(100 byte) NOT NULL,
'RICHIESTA' NUMBER(1),
CONSTRAINT 'PK_LOCALITA' PRIMARY KEY('IDLOCALITA') USING INDEX
TABLESPACE 'USERS' STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 16K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
CREATE TABLE 'TEMPES06'.'OFFERTA' ('IDOFFERTA' VARCHAR2(20 byte) NOT NULL,
'LOCALITA' VARCHAR2(20 byte) NOT NULL,
'DETTAGLIO' VARCHAR2(100 byte) NOT NULL,
'COSTO' NUMBER(10) NOT NULL,
'POSTI' NUMBER(10),
CONSTRAINT 'FK_OFFERTA_LOCALITA' FOREIGN KEY('LOCALITA')
REFERENCES 'TEMPES06'.'LOCALITA'('IDLOCALITA'),
CONSTRAINT 'PK_OFFERTA' PRIMARY KEY('IDOFFERTA', 'LOCALITA') USING INDEX
TABLESPACE 'USERS' STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 16K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
CREATE TABLE 'TEMPES06'.'PRENOTAZIONE' ('CLIENTE' VARCHAR2(20 byte) NOT NULL,
'IDOFFERTA' VARCHAR2(20 byte) NOT NULL,
'LOCALITA' VARCHAR2(20 byte) NOT NULL,
'DATAPRENOTAZIONE' DATE NOT NULL,
'ANTICIPO' NUMBER(10) NOT NULL,
'IMPIEGATO' VARCHAR2(20 byte) NOT NULL,
CONSTRAINT 'FK_PRENOTAZIONE_IMPIEGATO' FOREIGN KEY('IMPIEGATO')
REFERENCES 'TEMPES06'.'IMPIEGATO'('DIPENDENTE'),
CONSTRAINT 'FK_PRENOTAZIONE_OFFERTA' FOREIGN KEY('IDOFFERTA','LOCALITA')
REFERENCES 'TEMPES06'.'OFFERTA'('IDOFFERTA', 'LOCALITA'),
CONSTRAINT 'PK_PRENOTAZIONE' PRIMARY KEY('CLIENTE', 'IDOFFERTA',
'LOCALITA','IMPIEGATO') USING INDEX
TABLESPACE 'USERS' STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 16K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
CREATE TABLE 'TEMPES06'.'SEDE' ('CODICE' VARCHAR2(20 byte) NOT NULL,
'INDIRIZZO' VARCHAR2(100 byte) NOT NULL,
'TELEFONO' VARCHAR2(15 byte),
CONSTRAINT 'PK_SEDE' PRIMARY KEY('CODICE') USING INDEX
TABLESPACE 'USERS' STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 16K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
CREATE TABLE 'TEMPES06'.'DIPENDENTE' ('CF' VARCHAR2(20 byte) NOT NULL,
'NOME' VARCHAR2(50 byte) NOT NULL,
'COGNOME' VARCHAR2(50 byte) NOT NULL,
'INDIRIZZO' VARCHAR2(100 byte) NOT NULL,
'DATANASCITA' DATE NOT NULL,
'DATASTIPULA' DATE NOT NULL,
'STIPENDIO' NUMBER(10) NOT NULL,
'SEDE' VARCHAR2(20byte) NOT NULL,
CONSTRAINT 'FK_DIPENDENTE_SEDE' FOREIGN KEY('SEDE')
REFERENCES 'TEMPES06'.'SEDE'('CODICE'),
CONSTRAINT 'PK_DIPENDENTE' PRIMARY KEY('CF') USING INDEX
TABLESPACE 'USERS' STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 24K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
CREATE TABLE 'TEMPES06'.'IMPIEGATO' ('DIPENDENTE' VARCHAR2(20 byte) NOT NULL,
'TIPO' VARCHAR2(10 byte) NOT NULL,
CONSTRAINT 'FK_IMPIEGATO_DIPENDENTE' FOREIGN KEY('DIPENDENTE')
REFERENCES 'TEMPES06'.'DIPENDENTE'('CF'),
CONSTRAINT 'PK_IMPIEGATO' PRIMARY KEY('DIPENDENTE') USING INDEX
TABLESPACE 'USERS'
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 16K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
CREATE TABLE 'TEMPES06'.'OPERATORE' ('DIPENDENTE' VARCHAR2(20 byte) NOT NULL, 'MANSIONE' VARCHAR2(20 byte) NOT NULL,
CONSTRAINT 'FK_OPERATORE_DIPENDENTE' FOREIGN KEY('DIPENDENTE')
REFERENCES 'TEMPES06'.'DIPENDENTE'('CF'),
CONSTRAINT 'PK_OPERATORE' PRIMARY KEY('DIPENDENTE') USING INDEX
TABLESPACE 'USERS' STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 16K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
CREATE TABLE 'TEMPES06'.'CONTESTOLAVORO' ('OPERATORE' VARCHAR2(20byte) NOT NULL, 'IDOFFERTA' VARCHAR2(20 byte) NOT NULL,
'LOCALITA' VARCHAR2(20 byte) NOT NULL,
CONSTRAINT 'FK_CONTESOLAVORO_OFFERTA' FOREIGN KEY('IDOFFERTA','LOCALITA')
REFERENCES 'TEMPES06'.'OFFERTA'('IDOFFERTA', 'LOCALITA'),
CONSTRAINT 'FK_CONTESTOLAVORO_OPERATORE' FOREIGN KEY('OPERATORE')
REFERENCES 'TEMPES06'.'OPERATORE'('DIPENDENTE'),
CONSTRAINT 'PK_CONTESTOLAVORO' PRIMARY KEY('OPERATORE', 'IDOFFERTA', 'LOCALITA')
USING INDEX
TABLESPACE 'USERS'
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 16K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
CREATE TABLE 'TEMPES06'.'PERSONALEINLOCO' ('CF' VARCHAR2(20 byte)
NOT NULL, 'NOME' VARCHAR2(50 byte) NOT NULL,
'COGNOME' VARCHAR2(50 byte) NOT NULL,
'DATANASCITA' DATE NOT NULL,
'INDIRIZZO' VARCHAR2(100 byte) NOT NULL,
'MANSIONE' VARCHAR2(10 byte) NOT NULL,
'LOCALITA' VARCHAR2(20 byte) NOT NULL,
CONSTRAINT 'FK_PERSONALEINLOCO_LOCALITA' FOREIGN KEY('LOCALITA')
REFERENCES 'TEMPES06'.'LOCALITA'('IDLOCALITA'),
CONSTRAINT 'PK_PERSONALEINLOCO' PRIMARY KEY('CF') USING INDEX
TABLESPACE 'USERS' STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 24K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
IMPLEMENTAZIONE DELLE OPERAZIONI
Inserimento di un cliente.
Create or replace procedure InsertCliente (
cf_in IN cliente.cf %type,
nome_in IN cliente.nome%type,
cognome_in IN cliente.cognome%type,
indirizzo_in IN cliente.indirizzo%type,
telefono_in IN cliente.telefono%type) as
begin
insert into cliente(cf, nome, cognome, indirizzo, telefono)
values (cf_in, nome_in, cognome_in, indirizzo_in, telefono_in);
commit;
end InsertCliente;
begin
InsertCliente(' MGBVFVB55YTGFRG', 'Carlo', 'Bianco', ' Via Rossi 40-Napoli', '081569874');
end;
La registrazione di una prenotazione effettuata da un cliente, relativa ad una data offerta presso
una data località
L'inserimento nella tabella prenotazione è un'operazione più delicata dal momento che una prenotazione relativa ad una delle offerte proposte dall'agenzia può avvenire solo se ci sono ancora dei posti liberi. L'idea è quella di considerare una funzione InsertPren che restituisce un una stringa che riporta un messaggio di prenotazione registrata (nel caso in cui c'è un posto libero) o di offerta esaurita (in caso contrario).
All'interno di questa funzione viene richiamata una funzione che effettua il conteggio sulle prenotazioni già registrate relative alla stessa offerta e alla stessa località per la quale si desidera registrare la prenotazione. Essa restituisce FALSE se le prenotazioni hanno esaurito i posti, TRUE in caso contrario.
create or replace function InsertPren (
cf_in IN prenotazione.cliente%type,
idofferta_in IN prenotazione.idofferta%type,
località_ in IN prenotazione.località %type,
dataprenotazione_in IN prenotazione.dataprenotazione %type,
anticipo_in IN prenotazione.anticipo %type,
impiegato_in IN prenotazione.impiegato %type)
return varchar2 is
begin
declare
info varchar2(100);
begin
if not (controlloposti(località_in,
idofferta_in)) then
info: ='offerta esaurita';
return info;
else insert into prenotazione (cliente,idofferta,località,dataprenotazione,anticipo,impiegato)
values (cf_in, idofferta_in, località_ in, dataprenotazione_in, anticipo_in, impiegato_in);
commit;
info:= 'Prenotazione avvenuta';
return info;
end if
end;
end InsertPren;
create or replace function ControlloPosti (
idof_in IN prenotazione.idofferta%type,
loc_ in IN prenotazione.località %type)
return boolean is
begin
declare
numPosti number (10);
numPren number (10);
begin
select posti into numPosti from offerta
where offerta.idofferta=idof_in and offerta.località=loc_in;
select count (cliente) into numPren from prenotazione
where prenotazione. offerta.idofferta=idof_in and prenotazione.località=loc_in;
if numPosti=numPren then
return false;
else
return true;
end if;
end;
end controlloPosti;
Viene riportato di sotto il test effettuato.
create or replace procedure test as
begin
declare
info varchar2(100);
begin
info:=InsertPren ('GNG', '1','LAV',TO_DATE('01-02-04','DD-MM-YY'),100,'CCC')
DBMS_OUTPUT.PUT_LINE (info
end;
end;
end test;
Inserimento di un dipendente con ruolo di impiegato.
Create or replace procedure InsertDipendente(
cf_in IN dipendente.cf %type,
nome_in IN dipendente.nome%type,
cognome_in INdipendente.cognome%type,
DataNascita_in INdipendente.DataNascita %type,
indirizzo_in IN dipendente.indirizzo%type,
sede_in IN dipendente.sede%type,
DataStipula dipendente.DataStipula%type,
stipendio_in IN dipendente.stipendio%type) as
begin
insert into dipendente (cf, nome, cognome,DataNascita, indirizzo,sede,DataStipula,stipendio)
values (cf_in, nome_in, cognome_in,DataNascita_in,indirizzo_in,sede_in,DataStipula_in,
stipendio_in);
commit;
end InsertDipendente;
Create or replace procedure InsertImpiegato(
cf_in IN impiegato.cf %type,
tipo_in impiegato.tipo%type) as
insert into impiegato(cf,tipo)
values (cf_in, tipo_in);
commit;
end InsertImpiegato;
Seleziona il dettaglio ed il costo relativo a tutte le offerte presso una fissata località e con un costo inferiore un valore prefissato.
select offerta.dettaglio || ' ' || to char (offerta.costo)
from offerta, località
where (località.nome nomelocalità' and offerta.costo <='valorecosto' and
Ricerca i dipendenti dell'agenzia turistica che sono sia impiegati che operatori, per essi stampare
il nome, il cognome e la mansione che svolgono come operatori.
select dipendente.nome ||' '|| dipendente.cognome
from dipendente, impiegato, operatore
where(dipendente.cf =operatore.dipendente and dipendente.cf=impiegato.dipendente and
impiegato.tipo= ' part time'); /*Si osservi che la ricerca all'interno della tabella impiegato viene fatta
solo per quelle righe per le quali il campo tipo è 'part time', per il
fatto che solo un impiegato che lavora part time può svolgere anche la
mansione di operatore nel tempo restante*/
Ricerca il nome ed il cognome dell'impiegato che ha curato la prenotazione relativa ad un dato
cliente.
select dipendente.nome ||' '|| dipendente.cognome
from cliente, prenotazione, dipendente
where(cliente.nome='nomecliente' and cliente.cognome='cognomecliente' and
cliente.cf=prenotazione.cliente and prenotazione.impiegato=dipendente.cf);
L'agenzia turistica vuole tenere memoria di quali siano le località più gettonate tramite il campo
Richiesta della tabella Località. Inizialmente e cioè quando si popola la tabella tale campo è
nullo, per ogni Località.
L'agenzia turistica, inoltre, vuole avere una Classifica delle Località destinzione delle offerte di
viaggio proposte. Il Data Base, prevede una tabella Classifica, che ha due attributi: IdLocalità e
NumPren (numero di prenotazioni). Inizialmente tale tabella presenta gli identificativi di tutte le
Località, ma il valore del NumPren è nullo per ciascuno di essi.
Si ricorre ad un trigger sia per settare ad '1' il valore del campo Richiesta nella tabella Località
sia per tracciare la Classifica sulle Località .
In corrispondenza di una data località tale campo vale '1', se il numero di prenotazioni registrate
per offerte che hanno come destinazione quella località risulta maggiore di 10.
CREATE TABLE'TEMPES06'.'CLASSIFICA ('IDLOCALITA' VARCHAR2 (20 byte) NOT NULL, 'NUMPREN' NUMBER (10)
CONSTRAINT 'FK_CLASSIFICA _LOCALITA' FOREIGN KEY('IDLOCALITA')
REFERENCES 'TEMPES06'.'LOCALITA'('IDLOCALITA'),
CONSTRAINT 'PK_CLASSIFICA' PRIMARY KEY('IDLOCALITA') USING INDEX
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING;
Create or replace trigger Classifica after insert on Prenotazione
declare
nomevar località.IdLocalità %type;
numvar number(10);
cursor curs is select
IdLocalità, count (cliente) as numclienti
from Località, Prenotazione
where Prenotazione.Località=Località.IdLocalità;
group by IdLocalità;
begin
open curs;
loop
Fetch curs into nomevar,numvar;
Exit when curs notfound%;
if numvar>10 then
update Località set richiesta=1;
where IdLocalità=nomevar;
update Classifica set NumPren=numvar
where IdLocalità =nomevar;
end if;
end loop;
end;
A questo punto per ottenere la Classifica, bisogna ordinare la tabella sul valore del campo NumPren:
Select
from Classifica
Order by NumPren desc
Si vuole creare una vista riepilogo sui dipendenti dell'agenzia.
from (dipendente outer join operatore on dipendente.cf=operatore.dipendente) outer join
Si vogliono selezionare tutti gli operatori in loco relativi alla località più gettonata
Select località.nome, personaleInLoco.nome,personaleInLoco.cognome
from personaleInLoco,localita, classifica
Questo progetto può essere inserito in uno più vasto che tenga conto di aspetti non trattati in questa sede.
Ad esempio si può tenere in considerazione il rilascio di eventuali fatture al cliente che effettua la prenotazione e la gestione delle revoche delle prenotazioni stesse.
L'agenzia, inoltre, deve avere a sua disposizione delle viste sui voli proposti da diverse compagnie aeree, sugli orari dei treni e dei trasporti via mare.
Essa deve poter fornire al cliente informazioni che riguardano il clima, la cucina, la moneta di una determinata località turistica. Il cliente deve anche conoscere le eventuali precauzioni mediche che deve prendere per viaggi in località esotiche.
Un'ultima considerazione riguarda le attività di backup del DB progettato. Si presuppone che durante l'anno, l'attività di inserimento sia molto frequente nel periodo maggio-luglio, in concomitanza con le vacanze estive, e nel, periodo novembre-dicembre, in concomitanza delle festività natalizie. Pertanto in questi periodi l'attività di backup rivolta all'intero DB, viene effettuata con frequenza elevata, (ogni due giorni). Nel periodo restante, invece la frequenza è bassa (ogni quindici giorni).
Appunti su: database agenzia viaggi, attributi composti informatica, |
|