cor3+cours
cor3+cours
cor3+cours
I.1.A)Notation
nom_variable nom_variable_ref%TYPE ;
nom_variable nom_table.nom_colonne%TYPE ;
I.1.B)Exemples
Crédit REAL ;
Montant Crédit%TYPE ;
I.2.A)Notation
nom_variable nom_table%ROWTYPE ;
I.2.B)Exemple
UnClient Client%ROWTYPE ;
Numéro INTEGER,
Age INTEGER
);
Exemple :
CURSOR calcul IS
FROM produit ;
L’instruction SQL peut être n’importe quelle requête valide. Après son initialisation, les actions d’un
curseur peuvent être contrôlées avec les instructions OPEN, FETCH et CLOSE ou en utilisant une boucle
FOR.
NB :
Un tuple du curseur précédent sera de type calcul%ROWTYPE.
var1:=tuple.numprod ;
var2:=tuple.prixuni ;
END LOOP ;
...
END LOOP ;
CURSOR CursEmp IS
SELECT *
FROM Emp
BEGIN
END LOOP ;
CLOSE CursEmp ;
END ;
Version 2 :
DECLARE
CURSOR CursEmp IS
FROM Emp
var1 Emp.Nom%TYPE;
var2 Emp.Age%TYPE;
BEGIN
OPEN CursEmp;
LOOP
END LOOP;
CLOSE CursEmp;
END;
SELECT *
FROM Emp
BEGIN
LOOP
END LOOP ;
END ;
III. Applications
III.1) Activité 1
III.1.A) Énoncé
Déclarer un type nommé Personne basé sur deux types nommés respectivement IdPers et Adresse.
III.1.B) Correction
TYPE Personne IS RECORD
) ;
III.2) Activité 2
III.2.A) Énoncé
Soit la base de données Aéroport composée de tables suivants :
Avion (NumAv, NomAV, Capacité, Localisation)
Pilote (NumPilote, NomPilote, Ville, Salaire)
Vol (NumVol, #NumAv, #NumPilote, VilleDep, VilleArr, HeurDep, HeurArr)
On désire réduire de 12 % le temps de vol des avions 1 et 4. Pour les avions 2 et 8, la réduction du temps
de vol sera de 15 %.
On doit donc mettre à jour les nouveaux temps d’arrivée pour les avions concernés.
Écrire un bloc PL/SQL en utilisant un curseur permettant de lire les données suivantes : le numéro du vol,
le numéro de l’avion, l’heure de départ ainsi que celui d’arrivée pour les avions concernés par cette mise à
jour.
Pour chaque vol lu par le curseur, on va calculer le temps de vol et le réduire selon le pourcentage requis
afin de mettre à jour le champ HeurArr.
III.2.B) Correction
III.2.B.a) Version 1
DECLARE
CURSOR AvModif IS
FROM Vol
VolModif AvModif%ROWTYPE ;
tvol REAL ;
BEGIN
ELSE
END IF ;
UPDATE Vol
END LOOP ;
END ;
III.2.B.b) Version 2
DECLARE
CURSOR AvModif IS
FROM Vol
VolModif AvModif%ROWTYPE ;
tvol REAL ;
Ha AvModif.HeurArr%type ;
Hd AvModif.HeurDep%type ;
nv AvModif.NumVol%type ;
Na AvModif.NumAv%type ;
BEGIN
OPEN AvModif;
LOOP
tvol = ha – hd ;
ELSE
END IF ;
UPDATE Vol
WHERE NumVol = nv ;
END LOOP ;
close AvModif ;
END ;
III.3) Activité 3
III.3.A) Énoncé
On souhaite supprimer les valeurs en double (doublons) d’une colonne nommée « db1 » présente dans la
table Test.
1) Écrire un bloc PL/SQL permettant d’afficher les valeurs présentes au moins en double puis les
supprimer
2) Peut-on ajouter une contrainte de clé primaire sur cette colonne à partir du bloc PL/SQL ?
III.3.B) Correction
1)
DECLARE
CURSOR Doublons IS
SELECT db1
FROM Test
GROUP BY db1
n Doublons%ROWTYPE ;
BEGIN
DBMS_OUTPUT.PUT_LINE (n.db1) ;
VALUES (n.db1) ;
END LOOP ;
2)
ALTER TABLE Test
END ;
III.4) Activité 4
III.4.A) Énoncé
Soit la base de données suivante :
DEP (NumDep, NomDep, Emplacement)
Emp (NumEmp, NomEmp, Poste, Salaire, Commission, DateRecrut, #NumDep)
1) Écrire un bloc PL/SQL pour attribuer à l’employé numéro 140 une commission comme suit :
Si l’employé occupe le poste de vendeur, sa commission est de 100 dinars ;
Si l’employé occupe un autre poste alors il n’aura pas de commissions ;
Num Emp.NumEmp%TYPE ;
BEGIN
FROM Emp
UPDATE Emp
ELSE
UPDATE Emp
SET Commission = 0
END IF ;
COMMIT ;
END ;
2)
ACCEPT n PROMPT ''Donner n'' ;
DECLARE
CURSOR C1 IS
FROM Emp
Nom Emp.NomEmp%TYPE ;
Sal Emp.Salaire%TYPE ;
i Number ;
BEGIN
OPEN C1
END LOOP ;
CLOSE C1 ;
END ;
SELECT *
FROM Res ;
3)
DECLARE
CURSOR CS IS
FROM Emp
Nom Emp.NomEmp%TYPE ;
Sal Emp.Salaire%TYPE ;
BEGIN
OPEN CS
LOOP
END LOOP ;
END ;
SELECT *
FROM Tmp ;
4)
ACCEPT n PROMPT ''Donner n'' ;
DECLARE
CURSOR C IS
FROM Emp
FROM Emp
WHERE Salaire = V ;
Sal Emp.Salaire%TYPE ;
i NUMBER ;
BEGIN
OPEN C ;
LOOP
END LOOP ;
END LOOP ;
CLOSE C ;
END ;
SELECT *
FROM Tmp ;
5)
DECLARE
CURSOR C1 IS
......
CurVide EXCEPTION;
BEGIN
....
EXCEPTION
END;