Vous êtes sur la page 1sur 6

AU 2021/2022

Resp : Hamid AKSASSE


TP 7 : Solution

1- Dictionnaire de données

La base de données avec laquelle on va travailler, est conçue pour la gestion du


transport aérien. Il contient les relations suivantes :

Relation VOL :

Nom attribut Signification Type - contrainte


noVol Numéro d’identification d’un vol CHAR (6) clé primaire
Vildep Ville de départ VARCHAR (30)
Vilar Ville d’arrivée VARCHAR (30)
Dep_h Heure de départ (Heure) NUMBER (2)
Dep_nm Heure de départ (Minute) NUMBER (2)
Ar_h Heure d’arrivée (Heure) NUMBER (2)
Ar_mn Heure d’arrivée (Minute) NUMBER (2)
Ch_jour Jour d’arrivée NUMBER (1)

Relation PILOTE :

Nom attribut Signification Type - contrainte


Nopilot Numéro de matricule de pilote CHAR (4) clé primaire
Nom Nom du pilote VARCHAR (35)
Adresse Adresse de pilote limité à la ville VARCHAR (30)
Sal Salaire mensuel NUMBER (8,2)
Comm Commission mensuel qui ne pas exister NUMBER (8,2)
Embauche Date d’embauche Date

Relation Avion :

Nom attribut Signification Type - contrainte


Nuavion Numéro d’immatriculation d’un avion CHAR (4) clé primaire
Type Code désignant une famille d’un avion VARCHAR (3) clé étrangère
Annserv Année de mise en service NUMBER (4)
Nom Nom donné à un avion VARCHAR (50)
Nombre heures de vol depuis la mise en
Nbvol NUMBER (8)
service

Relation Affectation :

Nom attribut Signification Type - contrainte


CHAR (6) clé primaire, clé
Vol Numéro d’identification d’un vol
étrangère
Date_vol Date du vol sous la forma jj.mm.aa Date clé primaire
Pilote Numéro de pilote CHAR (4) clé étrangère
1
Avion Numéro d’immatriculation d’avion CHAR(4) clé étrangère
Nbpass Nombre effectif de passagers NUMBER (3)

Relation APPAREIL:

Nom attribut Signification Type - contrainte


Code normalisé désignant une famille
codeType CHAR (3) clé primaire
d’avion
Nbplace Nombre de place NUMBER (3)
Design Nom de la famille d’avion VARCHAR (50)

2- Création des tables

3- Quelques requêtes se prise en main de la base

a) la requête qui permet de lister les vols ayant un pilote qui habite dans la ville de
départ de vol est la suivante :
SELECT novol, vildep, vilar,nom
FROM vol a,pilote b,affectation c
WHERE a.vildep = b.adresse
AND a.novol = c.vol
AND b.nopilot = c.pilote

Le résultat de cette requête est :


NOVOL VILDEP VILAR NOM
------ ------ ------------ --------
IW201 LYON FORT DE FRANCE BARRE
AF8810 PARIS DJERBA DUVAL

b) La requête qui permet de lister les moyennes des heures de vol par type d’avions
qui ont un nombre d’heures tout type confondu est la suivante :

SELECT a.type TYPE,avg(nbhvol) as “Nom Moy de vol”


FROM avion a
Group By a.type
HAVING avg(nbhvol) < (select avg(nbhvol) from avion)

Le résultat de cette requête est :

TYPE Nom Moy de vol


--- --------------
734 8200
74E 11800
AB3 11300

c) La requête qui permet d’afficher les pilotes qui n’ont jamais affectés à un vol est la
suivante :

SELECT DISTINCT nopilot,nom


FROM pilote
WHERE nopilot NOT IN (select pilote from affectation);

2
Le résultat de cette requête :

NOPI NOM
---- -----------
3465 PIC

d) La requête qui permet d’afficher la liste des vols qui correspondent à des allers-
retours entre deux villes est la suivante :

SELECT v1.novol,v1.vildep,v1.vilar
FROM vol v1, vol v2
WHERE v1.vildep=v2.vilar
AND v2.vildep=v1.vilar;

Le résultat de cette requête est :

NOVOL VILDEP VILAR


------ ---------- -----------------
AF8809 DJERBA PARIS
AF8810 PARIS DJERBA

e) création de la table TOTAVION qui comptabilise par avion le nombre de personnes


transportées et le nombre de vol effectués :
CREATE TABLE TOTAVION
as
SELECT a.avion,sum(a.nbpass)as nbpass,count(a.vol)as nbvol
FROM affectation a,avion b
WHERE a.avion=b.nuavion
GROUP BY a.avion;

4- Création des vues


a) La requête de création d’une vue (v_pilote), qui constitue une restriction de la table
pilote, aux pilotes qui habitent à Paris est la suivante :
CREATE VIEW v_pilote as
SELECT * FROM pilote WHERE adresse='PARIS';

b) On peut modifier les salaire des pilotes habitant à Paris à travers la vue (v_pilote),
par l’exécution de la requête suivante :
UPDATE v_pilote
SET sal = sal+10;

c) La requête qui permet la création de la vue (dervol) qui donne la date du dernier vol
réalisé pour chaque avion est la suivante :
CREATE VIEW dervol as
select a.avion ,max(a.date_vol) as “date dernier vol”
from affectation a,avion b
where a.avion=b.nuavion
group by a.avion;

d) Création d’une vue pour vérifier lors de la modification ou de l’insertion d’un pilote
dans la table pilote les critères suivants :
o Un pilote habitant à paris a toujours une commission.

3
o Un pilote qui n’habite pas à paris n’a jamais de valeur de commission.

create view cr_pilote


as
select * from pilote
where ( adresse='PARIS' and comm Is null )
or
( pilote.adresse<>'PARIS' and comm. is not null)
with check option;

e) Création d’une vue (nocomm) qui permet de valider en saisie et mise à jour, le
montant commission d’un pilote selon les critères suivant :
o Un pilote qui n’est affecté à au moins un vol, ne peut pas avoir de
commission
o Un pilote qui est affecté à au moins un vol peut recevoir une commission.

CREATE VIEW nocomm


As SELECT * FROM pilote
WHERE (comm Is null and nopilot not in
(select distinct pilote from affectation))
or
nopilot in (select distinct pilote
from affectation and comm Is not null);

5- Compréhension des blocs PL/SQL

a) Le Scripte qui permet d’ajouter une commission de 500DH a chaque pilote sélectionner
avec le cureur C1 est le suivant:

DECLARE
CURSOR c1 IS SELECT nom,sal FROM pilote for update;
v_sal pilote.sal%type;
v_nom pilote.nom%type;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO v_nom,v_sal;
exit when c1%NOTFOUND;
UPDATE pilote SET comm=comm+500
WHERE current of c1;
END LOOP;
COMMIT;
CLOSE c1;
END;

b) Le Scripte qui permet de modifier le salaire d’un pilote avec les contraintes suivantes :
-Si la commission est supérieure au salaire alors on rajoute au salaire la valeur de la
commission et la commission sera mise à la valeur nulle.
-Si la valeur de la commission inférieure au salaire alors supprimer le pilote du curseur.

DECLARE
CURSOR cur1 IS SELECT nom,sal,comm ROM pilote FOR UPDATE;
v_nom pilote.nom%TYPE;
v_sal pilote.sal%TYPE;
v_comm pilote.comm%TYPE;
BEGIN
OPEN cur1;

4
LOOP
FETCH cur1 INTO v_nom , v_sal , v_comm;
exit when cur1%notfound;
dbms_output.put_line(v_sal);
IF v_comm > v_sal THEN
UPDATE pilote
SET sal = v_sal+v_comm ,comm=0
WHERE CURRENT OF cur1;
ELSif v_comm=0 THEN
DELETE FROM PILOTE
WHERE CURRENT OF cur1;
END IF;

END LOOP;
COMMIT;
CLOSE cur1;
END;

d) Calculer le nombre moyen de jours de repos entre deux affectations successives. (Utiliser
un curseur) et créer une table résultats pour stocker les résultats.
Création table résultats
CREATE TABLE resultat (
num CHAR(4),
nom VARCHAR2(35),
nbjours NUMBER(5,2)).

Solution
DECLARE
CURSOR C1 IS SELECT nopilot, nom, date_vol
FROM pilote, affectation
WHERE pilote = nopilot
AND pilote IN (SELECT pilote
FROM affectation
GROUP BY pilote
HAVING COUNT(*) >= 2)
ORDER BY 1, 2, 3;
v_pilote_1 pilote.nopilot%type;
v_pilote_2 pilote.nopilot%type;
v_nom_1 pilote.nom%type;
v_nom_2 pilote.nom%type;
v_date1 affectation.date_vol%type;
v_date2 affectation.date_vol%type;
v_nbjours NUMBER(6,2);
v_nbjmoy NUMBER(6,2);
v_vol NUMBER(4);
BEGIN
OPEN C1;
v_nbjours := 0;
v_vol := 0;
FETCH C1 INTO v_pilote_1, v_nom_1, v_date1;
LOOP
FETCH C1 INTO v_pilote_2, v_nom_2, v_date2;
EXIT WHEN (C1%NOTFOUND);
IF v_pilote_1 = v_pilote_2 THEN
v_nbjours := v_nbjours + (v_date2 - v_date1);
v_vol := v_vol + 1;
v_date1 := v_date2;
ELSE

5
v_nbjmoy := v_nbjours / v_vol;
v_nbjours := 0;
v_vol := 0;
INSERT INTO resultat
VALUES (v_pilote_1, v_nom_1, v_nbjmoy);
v_date1 := v_date2;
v_pilote_1 := v_pilote_2;
v_nom_1 := v_nom_2;
END IF;
END LOOP;
v_nbjmoy := v_nbjours / v_vol;
INSERT INTO resultat
VALUES (v_pilote_1, v_nom_1, v_nbjmoy);
END;

Vous aimerez peut-être aussi