Académique Documents
Professionnel Documents
Culture Documents
1- Dictionnaire de données
Relation VOL :
Relation PILOTE :
Relation Avion :
Relation Affectation :
Relation APPAREIL:
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
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 :
c) La requête qui permet d’afficher les pilotes qui n’ont jamais affectés à un vol est la
suivante :
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;
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.
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.
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;