-
Notifications
You must be signed in to change notification settings - Fork 0
/
fonctions.sql
91 lines (89 loc) · 2.77 KB
/
fonctions.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
--Question 1
CREATE OR REPLACE FUNCTION montantLocation(modeleVehicule IN NUMBER,joursDeLocation IN NUMBER) RETURN NUMBER IS
prixjour tarifs.prix_jour%type;
prixforfait tarifs.prix_forfait%type;
nombreDeModeles number:=0;
prixLocation number:=0;
BEGIN
IF (joursDeLocation>0) THEN
select count(*) into nombreDeModeles from modeles;
IF (modeleVehicule<=nombreDeModeles) THEN
select nvl(t.prix_jour,0) INTO prixjour
from tarifs t, categories c, modeles mo
where t.id_categorie=c.id_categorie
and c.id_categorie=mo.id_categorie
and mo.id_modele=modeleVehicule
and rownum=1
order by t.id_tarif;
select nvl(t.prix_forfait,0) into prixforfait
from tarifs t, categories c, modeles mo
where t.id_categorie=c.id_categorie
and c.id_categorie=mo.id_categorie
and mo.id_modele=modeleVehicule
and rownum=1
order by t.id_tarif;
IF (MOD(joursDeLocation,7)>0) then
prixLocation:=MOD(joursDeLocation,7)*prixjour;
END IF;
prixLocation:=prixLocation+((joursDeLocation-MOD(joursDeLocation,7))/7)*prixforfait;
END IF;
END IF;
RETURN prixLocation;
END;
/
--Question 1 bis
DECLARE
modele number:=1;
nombreJours number:=10;
BEGIN
DBMS_OUTPUT.PUT_LINE(montantLocation(modele,nombreJours));
END;
/
--Question 2
CREATE OR REPLACE PROCEDURE estDisponible(evoiture in vehicules.num_immatriculation%type,debut in dossiers.date_retrait%type,fin in dossiers.date_retour_prevu%type) is
reservation dossiers.id_dossier%type;
BEGIN
select d.id_dossier into reservation
from vehicules v,dossiers d
where d.num_immatriculation=v.num_immatriculation
and d.num_immatriculation=voiture
and (debut>d.date_retour_effectif or fin>d.date_retrait);
DBMS_OUTPUT.PUT_LINE('Véhicule disponible');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('véhicule non disponible à cette période');
END;
/
--Question 2 bis
DECLARE
debut date:='01/01/2013';
fin date:='02/01/2013';
voiture varchar(2):='QQ030KK';
nombreJours number:=10;
BEGIN
DBMS_OUTPUT.PUT_LINE(estDisponible(voiture,debut,fin));
END;
/
--Question 3
CREATE OR REPLACE PROCEDURE listeDisponible(cat in modeles.id_categorie%type,debut in dossiers.date_retrait%type,fin in dossiers.date_retour_prevu%type) is
CURSOR liste is
select v.num_immatriculation immat,mo.nom nom
from vehicules v,modeles mo,dossiers d,categories c
where d.num_immatriculation=v.num_immatriculation
and v.id_modele=mo.id_modele
and mo.id_categorie=c.id_categorie
and (sysdate>d.date_retour_effectif or sysdate<d.date_retrait)
and c.id_categorie=cat
group by v.num_immatriculation,mo.nom;
BEGIN
DBMS_OUTPUT.PUT_LINE('les vehicules de categorie '||cat||' suivants sont disponibles: ');
DBMS_OUTPUT.PUT_LINE(' ');
for boucle in liste loop
DBMS_OUTPUT.PUT_LINE('matricule'||boucle.immat);
end loop;
END;
/
BEGIN
listeDisponible(1,to_date('01/01/2013','MM/DD/YYYY'),to_date('02/01/2013','MM/DD/YYYY'));
END;
/