SET SERVEROUTPUT ON
Create OR Replace procedure Rezerwuj_VIP
(
IdGoscia number,
pocz date,
kon date,
kat number
)
AS
b integer;
NumRez integer;
IsVIP number;
Wolny pokoje.id_pokoju%type;
Cursor wolne_pokoje is
SELECT id_pokoju
FROM pokoje
WHERE id_kategorii = kat AND NOT EXISTS
(SELECT 1 FROM rezerwacje,r_przydzielona
WHERE rezerwacje.id_rezerwacji = r_przydzielona.id_rezerwacji
AND r_przydzielona.id_pokoju = pokoje.id_pokoju
AND (kon BETWEEN rezerwacje.rez_od AND rezerwacje.rez_do
OR pocz BETWEEN rezerwacje.rez_od AND rezerwacje.rez_do));
Cursor znajdz is
SELECT goscie.id_goscia, r_przydzielona.id_pokoju, r_przydzielona.id_rezerwacji
FROM pokoje, rezerwacje, goscie, r_przydzielona
WHERE pokoje.id_kategorii = kat
AND r_przydzielona.id_pokoju = pokoje.id_pokoju
AND rezerwacje.id_rezerwacji = r_przydzielona.id_rezerwacji
AND rezerwacje.id_goscia = goscie.id_goscia
AND VIP = 0
AND pocz BETWEEN rezerwacje.rez_od AND rezerwacje.rez_do
ORDER BY rezerwacje.rez_od DESC;
zmiana znajdz%rowtype;
BEGIN
SELECT Count (1) INTO b
FROM goscie
WHERE id_goscia = IdGoscia;
If b > 0 Then
Open wolne_pokoje;
Fetch wolne_pokoje INTO Wolny;
If wolne_pokoje%found Then
dbms_output.put_line ('Wolny jest pokoj nr '|| Wolny);
SELECT nvl(Max(id_rezerwacji) + 1 , 1) INTO NumRez FROM rezerwacje;
INSERT INTO rezerwacje VALUES (NumRez, IdGoscia, pocz, kon);
INSERT INTO r_przydzielona VALUES(NumRez, Wolny);
dbms_output.put_line (`Zarezerwowano Wolny pokoj nr '|| Wolny);
Else
dbms_output.put_line ('Nie ma wolnego pokoju tej kategorii');
SELECT VIP INTO IsVIP FROM goscie WHERE id_goscia = IdGoscia;
If IsVIP = 0 Then
dbms_output.put_line ('Wstawiamy do zamowien');
SELECT nvl(Max(id_rezerwacji) + 1, 1) INTO NumRez FROM rezerwacje;
INSERT INTO rezerwacje VALUES (NumRez, IdGoscia, pocz, kon);
INSERT INTO r_zamowiona VALUES (NumRez, kat);
Else -- to prawdziwy VIP
dbms_output.put_line ('To jest VIP!');
Open znajdz;
Fetch znajdz INTO zmiana;
If znajdz%found Then
SELECT id_rezerwacji INTO NumRez FROM rezerwacje
WHERE zmiana.id_rezerwacji= rezerwacje.id_rezerwacji;
INSERT INTO r_zamowiona VALUES( NumRez, kat);
DELETE FROM r_przydzielona WHERE id_rezerwacji = NumRez;
dbms_output.put_line('Wstawiamy do rezerwacji zamowionych '
||zmiana.id_goscia);
SELECT nvl(Max(id_rezerwacji) + 1, 1) INTO b FROM rezerwacje;
INSERT INTO rezerwacje VALUES (b, IdGoscia, pocz, kon);
INSERT INTO r_przydzielona VALUES (b, zmiana.id_pokoju);
dbms_output.put_line('Wstawiamy do rezerwacji przydzielonych '
||IdGoscia);
Else
dbms_output.put_line(`Rezerwacja nie jest mozliwa');
SELECT nvl(Max(id_rezerwacji) + 1, 1) INTO b FROM rezerwacje;
INSERT INTO rezerwacje VALUES (b, IdGoscia, pocz, kon);
INSERT INTO r_zamowiona VALUES (b, kat);
End If;
End If;
End If;
Close wolne_pokoje;
Else
dbms_output.put_line('Nie ma takiego goscia');
End If;
End;
---------------------------------------------------
create OR replace trigger daty
before insert OR update of rez_od, rez_do
on rezerwacje
for each row
begin
if( :new.rez_od > :new.rez_do) Then
dbms_output.put_line('zly zakres daty');
Raise_application_error(-20555,' zly zakres daty');
end if;
end;
INSERT INTO rezerwacje VALUES (10,3,'98-4-4','98-4-2');
Zmiana schematyu daty (dla aktualnej sesji)
Alter session set nls_date_format = `yyyy-mm-dd'