|
Appunti informatica |
|
Visite: 3363 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:Documento delle Specifiche relativo alla progettazione di una base di dati per la gestione dei dipartimenti del Polo Didattico delle Scienze (v. 1.0)Documento delle Specifiche relativo alla progettazione di una base di dati per la DB SpazialiDB Spaziali I dati territoriali (geometrici) sono oramai importanti per molte organizzazioni.. I I Semafori , ovvero la gestione della multiutenzaI Semafori , ovvero la gestione della multiutenza Chiariamo subito una cosa: già |
"CATENA DI ALBERGHI"
Pina Acierno
Si vuole realizzare una base di dati per una catena di grandi alberghi. Per ogni albergo, si vuole tenere traccia del nome, della località, del numero di camere e box auto presenti nell'albergo, del nome del direttore, nonché del numero di camere e box auto attualmente disponibili.
I clienti possono effettuare prenotazioni, presso uno o più alberghi appartenenti alla catena. La prenotazione è identificata da un codice e contiene il cognome del cliente, la data in cui è stata effettuata, le date previste di arrivo e partenza, e il numero di camere (ed eventualmente di box auto) prenotati.
Le camere sono caratterizzate da un numero (valido solo all'interno di ogni singolo albergo), dal tipo di camera (singola, doppia, suite, ecc.), dal numero di letti, dalla presenza o meno di servizi. I box auto, sono caratterizzati da un numero (valido solo all'interno di ogni singolo albergo) dall'ubicazione, dalla dimensione, dal tipo (coperto/scoperto).
Per ogni camera occupata si vuole tenere traccia delle informazioni relative agli ospiti, in particolare, numero del documento d'identità , nome, cognome, residenza, data di nascita. Inoltre, si vuole tenere traccia della prenotazione con la quale la camera era stata riservata. Per ogni box auto, si vuole tenere traccia delle camere in cui risiedono gli ospiti che lo utilizzano.
Termine originario |
Termine sostitutivo |
Ospite |
Cliente |
Per la catena di alberghi sono previste alcune relazioni, di cui riportiamo una breve descrizione :
O1 Introduci un nuovo cliente 100g
O2 Eliminazione dei dati di un cliente già memorizzato
O3 Prenota una camera con o senza box 1000g
O4 Cancella una prenotazione 400g
In questo paragrafo ci si occupa della fase di analisi e ristrutturazione dei requisiti raccolti, producendo un insieme omogeneo e non ambiguo di specifiche da utilizzare nelle fasi successive della progettazione.
Si individuano i termini più rilevanti con eventuali sinonimi e omonimi utilizzando un glossario dei termini ai quali associamo una breve descrizione.
Termine |
Descrizione |
Sinonimi |
Termini collegati |
Albergo |
Stabile |
Hotel |
Camere box cliente |
Cliente |
Soggetto che richiede la stanza |
Ospite Persona |
Prenotazione Camera |
Camera |
Camera presente in un albergo |
|
Albergo Box Cliente |
Box |
Posto auto |
Posto Parcheggio Garage |
Albergo Camera |
Prenotazione |
Richiesta di una camera da parte di un cliente, in un tempo anticipato |
|
Cliente Camere |
Per l'albergo (circa 100),si rappresenta dati come il nome, località e nome direttore, l'unione di nome e località identifica l'albergo |
Per i clienti (circa 3000), si rappresentano i dati anagrafici come nome, cognome, data di nascita, residenza e codice fiscale. |
Per le camere (circa 3000), si rappresenta dati come il numero (che lo identificano all'interno di un unico albergo), il tipo (come suite, singola doppia eccetera), e la presenza o meno dei servizi. |
Per i box (circa 900), si rappresenta dati come il numero (che lo identificano all'interno di un unico albergo), l'ubicazione, il tipo (coperto o scoperto). |
Per le prenotazioni (circa 500), si rappresenta un codice per identificarlo, il cognome del cliente la data di inizio e la data di fine del periodo di pernottamento, il numero della camera e l'eventuale numero box |
Entità |
Descrizione |
Attributi |
Identificatore |
Camera |
Camera presente in un albergo |
Numero letti Servizi Numero |
Numero, nome e località dell'albergo |
Cliente |
Soggetto che prenota una camera e/o la occupa |
Numero C.I. Nome Cognome Data di nascita Residenza |
Numero C.I. |
Albergo |
Stabile |
Nome Località Nome direttore |
Nome, località |
Box |
Luogo nel quale far sostare l'auto |
Numero Ubicazione Dimensione |
Numero, nome e località dell'albergo |
Relazione |
Entità partecipanti |
Descrizione |
Attributi |
Composizione |
Albergo camera |
Gli alberghi contengono al loro interno un diverso numero di camere |
|
Possesso |
Albergo box |
Gli alberghi possono avere dei box per le auto dei clienti |
Id Data arrivo Data partenza |
Prenotazione |
Cliente Camera Prenotazione |
Un cliente può prenotare una o più camere |
|
Occupazione |
Cliente Camera |
I clienti ospitano una camera per un certo periodo |
Data Arrivo Data Partenza |
Associazione |
Box Camera |
Se un cliente usufruisce di un box, quest'ultimo è associato alla camera in cui risiede |
|
Si effettua, ora, la progettazione logica della base di dati.
Analisi delle ridondanze
Si è effettuata prima una analisi delle ridondanze, da tale anali si è trovata una ridondanza nella relazione prenotazione, poiché il box è già associato alla camera.
Nello schema sono presenti due gerarchie.
Per quanto riguarda le camere, le entità suite, doppia e singola possono essere sostituite da un attributo chiamato tipo perché non indicano niente altro che il tipo che la camera può assumere. Analogamente avviene per l'entità box che assumerà l'attributo tipo, in questo caso di tipo boleano.
Concetto |
Tipo |
Volume |
Albergo |
E |
|
Camera |
E |
|
Box |
E |
|
Cliente |
E |
|
Occupazione |
R |
|
Prenotazione |
R |
|
Associazione |
R |
|
Concetto |
Costrutto |
Accessi |
Tipo |
Albero |
Entità |
1 al mese |
L |
Camera |
Entità |
200 al giorno |
L |
Box |
Entità |
50 al giorno |
L |
Cliente |
Entità |
100 al giorno |
SL |
Prenotazione |
Relazione |
100 al giorno |
SL |
Occupazione |
Relazione |
5 al giorno |
S |
Associazione |
Relazione |
1 al giorno |
S |
Operazione |
Descrizione |
Frequenza |
Tipo |
O1 |
Introduci un nuovo cliente |
100 al giorno |
OL |
O2 |
Eliminazione dei dati di un cliente già memorizzato |
200 al giorno |
B |
O3 |
Prenota una camera con o senza box |
10000 al giorno |
OL |
O4 |
Cancella una prenotazione |
400 al giorno |
OL |
O5 |
Consegna la camera con o senza box |
800 al giorno |
OL |
Cammino di join
|
|
Si individuano una serie di schemi di R-relazioni, l'albergo introduce un nuovo attributo che diventerà la chiave, essendo richiamato in molte entità:
Traduzione di relazioni
Relazioni uno a uno non sono presenti.
Di relazioni molti a molti sono presenti prenota e occupazione, esse vanno entrambe tradotte in R-relazioni:
Le relazioni uno a molti sono: associazione, composizione e possedere.
Gli ultimi due sono rilevabili delle chiavi esterne rispettivamente di camera e box, la prima invece deve essere rappresentata dalla seguente tabella:
Implementazione di alcune operazioni.
In questo paragrafo è proposta l'implementazione di alcune delle operazioni che definiscono la catena di alberghi.
* script di istallazione
create database CatenaAlberghi
*Albergo
Si prevede che la catena comprende 100 alberghi, tale numero andrà a modificarsi solo con l'acquisto di un altro albergo che accade di rado. Ciò fa sì che il tablespace delle tabelle albergo, camere e box è quasi invariato nel tempo.
CREATE TABLE 'ALBERGO' ('ID' NUMBER(10) NOT NULL,
'NOME' VARCHAR2(20) NOT NULL,
'LOCALITA' VARCHAR2(20) NOT NULL, 'INDIRIZZO' VARCHAR2(30) NOT NULL, 'NOME_DIRETTORE' VARCHAR2(10) NOT NULL, PRIMARY KEY('ID'))
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 60 INITRANS 2
STORAGE ( INITIAL 16384 NEXT 8192 PCTINCREASE 0)
*camera
La seguente create table presuppone che le camere sono memorizzate su bd diversi in base all'albergo.
CREATE TABLE 'CAMERA' ('NUMERO' NUMBER(10) NOT NULL,
'NUM_LETTI' NUMBER(10) NOT NULL, 'TIPO' NVARCHAR2(15) NOT
NULL, 'ALBERGO' NUMBER(10) NOT NULL,
CONSTRAINT 'SYS_C003615' PRIMARY KEY('NUMERO', 'ALBERGO')
USING INDEX
TABLESPACE 'USERS'
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255,
CONSTRAINT 'SYS_C003616' FOREIGN KEY('ALBERGO')
REFERENCES 'ALBERGO'('ID'))
TABLESPACE 'USERS' PCTFREE 20 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 80K NEXT 8K PCTINCREASE 0)
NOLOGGING
PARTITION BY RANGE ('ALBERGO') (PARTITION 'CAMERA_P1'
VALUES LESS THAN (15)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING,
PARTITION 'CAMERA_P2'
VALUES LESS THAN (30)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING,
PARTITION 'CAMERA_P3'
VALUES LESS THAN (45)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING,
PARTITION 'CAMERA_P4'
VALUES LESS THAN (60)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING,
PARTITION 'CAMERA_P5'
VALUES LESS THAN (75)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING,
PARTITION 'CAMERA_P6'
VALUES LESS THAN (90)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING,
PARTITION 'CAMERA_P7'
VALUES LESS THAN (105)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING,
PARTITION 'CAMERA_P8'
VALUES LESS THAN (120)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING,
PARTITION 'CAMERA_P9'
VALUES LESS THAN (135)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING,
PARTITION 'CAMERA_P10'
VALUES LESS THAN (150)
TABLESPACE 'USERS' PCTFREE 20 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 80K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) LOGGING)
*box
CREATE TABLE 'BOX' ('ALBERGO' NUMBER(10) NOT NULL,
'NUMERO' NUMBER(10) NOT NULL, 'UBICAZIONE' VARCHAR2(20 byte)
NOT NULL, 'TIPO' NUMBER(1) NOT NULL, 'DIMENSIONE' NUMBER(10)
NOT NULL,
CONSTRAINT 'BOOL_BOX' CHECK(tipo=0 or tipo=1),
CONSTRAINT 'FK_BOX_ALBERGO' FOREIGN KEY('ALBERGO')
REFERENCES 'ALBERGO'('ID'),
CONSTRAINT 'PK_BOX' PRIMARY KEY('ALBERGO', 'NUMERO'))
TABLESPACE 'USERS' PCTFREE 5 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 48K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING
*Cliente
Le tabelle create di seguito hanno una crescita considerevole nel tempo, quindi i tablespace cresceranno notevolmente. Quello della tabella cliente ha una crescita minore rispetto agli altri perché sono previsti clienti fedeli.
CREATE TABLE 'CLIENTE' ('CI' VARCHAR2(10 byte) NOT
NULL, 'NOME' VARCHAR2(20 byte) NOT NULL, 'COGNOME'
VARCHAR2(20 byte) NOT NULL, 'DATA_NASCITA' DATE NOT NULL,
'RESIDENZA' VARCHAR2(40 byte) NOT NULL,
CONSTRAINT 'SYS_C003635' PRIMARY KEY('CI')
USING INDEX
TABLESPACE 'USERS'
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS
255
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING
* Prenotazioni
Si è creato una sequenza per incrementare automaticamente il valore id della tabella prenotazione.
CREATE SEQUENCE 'CATENAALBEGHI'.'CONT_PREN' INCREMENT BY 1 START WITH
21 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER
CREATE TABLE 'PRENOTAZIONE' ('ID' NUMBER(10) NOT NULL,
'CLIENTE' VARCHAR2(10 byte) NOT NULL, 'ALBERGO' NUMBER(10)
NOT NULL, 'CAMERA' NUMBER(10) NOT NULL, 'NUM_BOX' NUMBER(10)
NOT NULL, 'DATA_ARRIVO' DATE NOT NULL, 'DATA_PARTENZA' DATE
NOT NULL,
CONSTRAINT 'CK_DATE_PRENOTAZIONI'
CHECK(data_arrivo<data_partenza),
CONSTRAINT 'FK_PRENOTAZIONE_CAMERA' FOREIGN KEY('CAMERA',
'ALBERGO')
REFERENCES 'CAMERA'('NUMERO', 'ALBERGO'),
CONSTRAINT 'FK_PRENOTAZIONE_CLIENTE' FOREIGN KEY('CLIENTE')
REFERENCES 'CLIENTE'('CI'),
CONSTRAINT 'PK_PRENOTAZIONE' PRIMARY KEY('ID')
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 808K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING
*Occupazione
CREATE TABLE 'OCCUPAZIONE' ('ALBERGO' NUMBER(10) NOT
NULL, 'CAMERA' NUMBER(10) NOT NULL, 'DATA_ARRIVO' DATE NOT
NULL, 'DATA_PARTENZA' DATE NOT NULL, 'BOX_ASSOCIATO'
NUMBER(10) NOT NULL, 'CLIENTE' VARCHAR2(10 byte) NOT NULL,
CONSTRAINT 'FK_CLIENTE' FOREIGN KEY('CLIENTE')
REFERENCES 'CLIENTE'('CI'),
CONSTRAINT 'FK_OCC_BOX' FOREIGN KEY('ALBERGO',
'BOX_ASSOCIATO')
REFERENCES 'BOX'('ALBERGO', 'NUMERO'),
CONSTRAINT 'FK_OCC_CAMERA' FOREIGN KEY('CAMERA', 'ALBERGO')
REFERENCES 'CAMERA'('NUMERO', 'ALBERGO'),
CONSTRAINT 'PK_OCCUPAZIONE' PRIMARY KEY('ALBERGO', 'CAMERA',
'DATA_ARRIVO')
USING INDEX
TABLESPACE 'USERS'
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 10 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 1400K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING
*Associazione
CREATE TABLE 'ASSOCIAZIONE' ('BOX' NUMBER(10) NOT NULL,
'ALBERGO' NUMBER(10) NOT NULL, 'CAMERA' NUMBER(10) NOT NULL,
'DATA_INIZIO' DATE NOT NULL, 'DATA_FINE' DATE NOT NULL,
CONSTRAINT 'FK_ASS_BOX' FOREIGN KEY('ALBERGO', 'BOX')
REFERENCES 'BOX'('ALBERGO', 'NUMERO'),
CONSTRAINT 'FK_ASS_CAMERA' FOREIGN KEY('CAMERA', 'ALBERGO')
REFERENCES 'CAMERA'('NUMERO', 'ALBERGO'),
CONSTRAINT 'PK_ASSOCIAZIONE' PRIMARY KEY('BOX', 'ALBERGO',
'CAMERA', 'DATA_INIZIO')
USING INDEX
TABLESPACE 'USERS'
STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0) PCTFREE 10 INITRANS 2 MAXTRANS 255)
TABLESPACE 'USERS' PCTFREE 10 PCTUSED 0 INITRANS 2 MAXTRANS
255
STORAGE ( INITIAL 48K NEXT 0K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0)
LOGGING
La seguente procedura controlla se l'ospite è un vecchio cliente, in caso contrario memorizza i suoi dati nel db.
create or replace procedure ins_cliente
(n in cliente.nome %type, -- nome cliente
c in cliente.cognome %type, -- cognome cliente
carta in cliente.ci %type, -- numero carta di identità
nascita in cliente.data_nascita %type, -- data di nascita
indirizzo in cliente.residenza %type -- residenza del cliente
) is
begin
declare
presente number(5);
begin
-- controlla se il cliente è già memorizzato
select count(*) into presente from cliente where ci=carta;
if presente=0 then
-- inserisce i dati del cliente nel db
insert into cliente values(carta,n,c,nascita,indirizzo);
commit;
end if;
end;
end ins_cliente;
La cancellazione nella tabella cliente, avviene solo nel caso in cui un nuovo cliente ha prenotato e poi disdetto una camera, quindi solo dopo la cancellazione della prenotazione.
Tale operazione è fatta dal seguente trigger, che seleziona i clienti che non hanno mai occupato una stanza e non hanno una prenotazione, li copia in un cursore tramite il quale identifica i clienti da cancellare :
create or replace trigger del_cliente
after delete on prenotazione
for each row
declare
cli cliente.ci %type;
-- creazione del cursore
cursor cliente_as is
select c.ci from cliente c, occupazione o prenotazione p where c.ci!=o.cliente and c.ci!=p.cliente
begin
-- apertura del cursore
open cliente_as;
fetch cliente_as into cli;
while cliente_as %notfound
loop
-- cancellazione del cliente
delete from cliente where ci=cli;
fetch cliente_as into cli;
end loop
--chiusura del cursore
close cliente_as;
commit;
end;
Di seguito sono rappresentate sia le procedure di controllo che la procedura di inserimento.
Quando un cliente chiede di prenotare una camera, un responsabile dell'albergo controlla se ci sono camere e box liberi per il periodo e del tipo richiesto.
La camera è controllata dalla funzione disp() che utilizza una query innestata che interroga le tabelle camera, albergo e prenotazione, il box è controllato dalla funzione posti_liberi() che restituisce il numero di posti liberi in un dato periodo, infine la procedura prenota() effettua la prenotazione inserendo una tupla nella relativa tabella.
create or replace function disp
(nome_alb in albergo.nome %type, -- nome albergo
loc in albergo.localita %type, -- località albergo
tip in camera.tipo %type, -- tipo di camera richiesta
arrivo in prenotazione.data_arrivo %type, -- data arrivo
partenza in prenotazione.data_partenza %type) -data partenza
return varchar2
is
begin
declare
libero varchar2(100
cam camera.numero %type;
alb camera.albergo %type;
cursor cur is
select c.numero, c.albergo
from camera c inner join albergo a on c.albergo=a.id
where a.nome=nome_alb and a.localita=loc and c.tipo=tip and c.numero<> ALL(select camera
from prenotazione p
where p.data_arrivo<=partenza and p.data_partenza>=arrivo);
begin
open cur
loop
fetch cur into cam,alb; exit when cur %notfound;
libero:=libero||to_char(cam)||' '||to_char(alb);
end loop;
close cur;
--restituisce l'elenco delle camere libere
return libero;
end;
end disp;
create or replace function posti_liberi
(num in albergo.id %type, -- id albergo
arrivo in prenotazione.data_arrivo %type, -- data di arrivo
partenza in prenotazione.data_partenza %type --data partenza
return number
is
begin
declare
libero number(5);
tutti number(5);
pieni number(5);
begin
-- conta i posti presenti in un albergo
select count(*) into tutti from box b where b.albergo=num;
-- selezionna il numero dei posti occupati
select sum(p.num_box) into pieni from prenotazione p where p.albergo=num and p.data_arrivo<=partenza and p.data_partenza>=arrivo;
/* restituisce il numero dei posti liberi sottraendo i totali da quelli occupato */
libero:=(tutti-pieni);
return libero;
end;
end posti_liberi;
create or replace procedure prenota
n in cliente.nome %type, --nome cliente
c in cliente.cognome %type, -- cognome cliente
ci in cliente.ci %type, -- numero della carta di identità
nascita in cliente.data_nascita %type, -- data di nascita
indirizzo in cliente.residenza %type, --indirizzo del cliente
cod_alb in albergo.id %type, --codice albergo
num_camera in camera.numero %type, -- numero camera
arrivo in prenotazione.data_partenza %type, --data di arrivo
partenza in prenotazione.data_partenza %type, --data di partenza
n_box in prenotazione.num_box %type) --quantità dei box richiesti
as begin
begin
-- inserisce i dati del cliente
ins_prenota(ci,n,c,nascita,indirizzo);
-- inserisce i dati della prenotazione
insert into prenotazione values (cont_pren.nextval,ci,cod_alb,num_camera,n_box,arrivo,partenza);
commit;
end;
end prenota;
Nel caso in cui un cliente annulla una prenotazione la seguente procedura, date le informazioni della prenotazione ed il numero della carta di identità del cliente, elimina una tupla dal db.
create or replace procedure del_prenotazione
(carta in cliente.ci %type, --numero carta di identità
cod_alb in albergo.id %type, --codice albergo
num_camera in camera.numero %type, -- numero camera
arrivo in prenotazione.data_partenza %type, -- data di arrivo
partenza in prenotazione.data_partenza %type) is
begin
declare
codice prenotazione.id %type;
begin
/* elimina la tupla in cui sono memorizzati i dati della prenotazione annullata */
select id into codice from prenotazione where cliente='carta' and albergo='cod_alb' and data_arrivo='arrivo' and camera='num_camera';
delete from prenotazione where id=codice;
end;
end del_prenotazione;
Operazioni O4
La seguente procedura è utilizzata quando un cliente arriva nell'albergo e gli vengono consegnate le chiavi della camera. Il database sarà aggiornato nella tabella occupazione, e nel caso di un nuovo cliente in quella cliente.
create or replace procedure arrivo
n in cliente.nome %type, --nome cliente
c in cliente.cognome %type, -- cognome cliente
carta in cliente.ci %type, --numero carta si identità del cliente
--data di nascita del cliente
nascita in cliente.data_nascita %type,
indirizzo in cliente.residenza %type, --residenza del cliente
cod_alb in albergo.id %type, -- codice associato all'albergo
num_camera in camera.numero %type, --numero della camera assegnata
--numero di boxs richiesti
numero_b in occupazione.box_associato %type,
oggi in prenotazione.data_partenza %type, --data odierna
-- data di presunto rilascio della camera
partenza in prenotazione.data_partenza %type
as
begin
declare
presente number(5);
i number(5);
boxs box.numero %type;
--cursore di appoggio per il numero dei boxs liberi
cursor cur_box is
select num_box from prenotazione p where p.albergo=cod_alb and p.data_arrivo<=partenza and p.data_partenza>=oggi;
begin
-- controlla se il cliente è già stato ospite
select count(*) into presente from cliente where ci=carta;
if presente=0 then
--inserimento dei dati del cliente, se nuovo
insert into cliente values(carta,n,c,nascita,indirizzo);
end if;
-- aggiornamento della tabella occupazione
insert into occupazione values (cod_alb,num_camera,oggi,partenza,numero_b,carta);
i:=0;
open cur_box;
while i<numero_b loop
fetch cur_box into boxs;
-- aggiornamento della tabella associazione
insert into associazione values (boxs,cod_alb,num_camera,oggi,partenza);
i:=i+1;
end loop;
close cur_box;
end;
end arrivo
Ulteriori operazioni
La seguente funzione cerca il cliente che ha trascorso più tempo negli alberghi, questo potrebbe servire per dare un trattamento migliore ad un cliente fedele.
create or replace function miglior_cliente ()
return varchar2
is
begin
declare
clien varchar2(100);
giorni number(5);
massimo number(5);
mcliente occupazione.cliente %type;
arrivo occupazione.data_arrivo %type;
partenza occupazione.data_partenza %type;
cli occupazione.cliente %type;
ci_cli occupazione.cliente %type;
/*dichiarazione di un curso che serve come appoggio per effettuare calcoli basati sui dati della tabella occupazione*/
cursor cur is
select data_arrivo, data_partenza, cliente from occupazione order by cliente asc;
begin
massimo:=0;
open cur;
fetch cur into arrivo, partenza, cli;
-- ciclo sulle tuple della tabella occupazione
while not(cur %notfound) loop
ci_cli:=cli;
giorni:=0;
-- ciclo sulle tuple della tabella occupazione che fanno riferimento allo stesso cliente
while (not(cur%notfound) and cli=ci_cli) loop
giorni:=giorni+(partenza-arrivo);
fetch cur into arrivo, partenza, cli;
end loop;
-- ricerca del massimo tra il numero di pernottamenti dei clienti
if massimo<giorni then
mcliente:=cli; -- identificazione della chiave del miglior cliente
massimo:=giorni;
end if;
end loop;
close cur;
-- selezione del miglior cliente
select to_char(nome)||' '||to_char(cognome) into clien from cliente where ci=mcliente;
return clien;
end;
end;
Il progetto creato tratta di una catena di circa 100 alberghi con relativa gestione delle prenotazioni e della permanenza dei clienti. Naturalmente questi sono problemi presenti in ogni albergo, ma sicuramente non sono gli unici.
Altre operazioni che dovrebbero essere informatizzate sono il calcolo delle ricevute,la gestione dei sevizi che può offrire un albergo come il ristorante, il frigobar, informazioni turistiche ecc, la gestione del personale, eventuali statistiche per aumentare la clientela.
Tali servizi possono essere presenti in alcuni alberghi mentre in altri no, oppure differenziarsi in base al luogo in cui si trova un albergo (montagna, mare, città).
Per informatizzare la gestione delle ricevute bisogna inserire un campo prezzo nell'entità camera che varia in base all'albergo, al tipo, e ai servizi che offre come TV, terrazzino, telefono ecc. Poi è necessaria una procedura che moltiplica il costo della camera per il numero di pernottamento che si ricava dalla tabella occupazione.
Come visto, il minimondo di questo progetto è applicabile in un mondo più vasto e complesso quindi potrà essere ampliato ed intergrato ad altri già presenti.
Per quel che riguarda il backup dei dati è importante fare spesso un salvataggio almeno delle tabelle occupazione e cliente in modo da non effettuare errori nel calcolo dei giorni da far pagare al cliente.
Appunti su: https:wwwappuntimaniacominformaticadatabaseprogetto-del-modulo-di-basi-di15php, |
|