TD 2
TD 2
TD 2
Exercice 1 : Tableau
1. Dans un bloc PL/SQL anonyme, définir un type tableau (VARRAY) de réels de taille 10 qui contiendra des
notes d’examen.
2. Dans la section de déclaration, définir une variable de ce type et l’initialiser avec trois notes.
3. Dans la section de code, terminer l’initialisation avec les 7 notes manquantes. Tester !
7. À l’aide de la méthode TRIM, effacer une note du tableau, puis afficher de nouveau la taille maximum et la
taille réelle du tableau.
8. À l’aide de la méthode DELETE, effacer le tableau, puis afficher de nouveau la taille maximum et la taille
réelle du tableau.
2. Dans un bloc PL/SQL anonyme, définir un type liste (TABLE) de réels qui contiendra les notes de contrôle
continu stockées dans la relation NOTATION.
4. Dans la section de code, charger en mémoire dans la collection les notes de contrôle continu (NOTECC)
contenues dans la relation NOTATION à l’aide d’un curseur implicite. Afficher les notes au fur et à mesure.
Tester ! Ce traitement aurait-il été possible avec un tableau ?
6. Vérifier que votre calcul est bon en affichant le résultat d’une requête SQL utilisant la fonction d’agrégat
AVG().
7. Afficher à l’écran l’indice du premier élément de la collection, l’indice du dernier élément et le nombre
d’éléments dans la collection.
1. Dans un bloc PL/SQL anonyme, définir un type enregistrement (RECORD) compose des champs
suivants :
• nom, du même type que l’attribut ENAME de la table EMP ;
• fonction, du même type que l’attribut JOB de la table EMP ;
• salaire_tot, du même type que l’attribut SAL de la table EMP.
3. Définir un curseur paramétré permettant de lister le nom (ENAME), la fonction (JOB) et le salaire total
(SAL + COMM) des employés d’un département (NODEPT) donné de la table EMP.
Indication : Utiliser la fonction NVL1 pour éviter les problèmes d’addition de valeurs NULLes.
4. Dans la section de code, parcourir le curseur paramétré pour le département n° 30, stocker le résultat
dans la variable enregistrement et l’afficher au format « NOM (FONCTION) : SALAIRE_TOT € ».
1
http://docs.oracle.com/database/121/SQLRF/functions130.htm#SQLRF00684
-- Exercice 1
DECLARE
TYPE TabReels IS VARRAY(10) OF REAL;
notes TabReels := TabReels(10.5, 15, 13);
i INTEGER;
moy REAL := 0;
BEGIN
notes.EXTEND(7);
notes(4) := 8.5;
notes(5) := 18.5;
notes(6) := 16;
notes(7) := 4;
notes(8) := 9.5;
notes(9) := 12;
notes(10) := 11;
notes.TRIM;
DBMS_OUTPUT.PUT_LINE('Taille actuelle / Taille limite = '
||notes.COUNT||' / '||notes.LIMIT);
notes.DELETE;
DBMS_OUTPUT.PUT_LINE('Taille actuelle / Taille limite = '
||notes.COUNT||' / '||notes.LIMIT);
END;
-- Exercice 2
DECLARE
TYPE ListeReels IS TABLE OF REAL;
notes ListeReels := ListeReels();
CURSOR notes_stockees IS SELECT notecc FROM notation
WHERE notecc IS NOT NULL;
nuplet notes_stockees%ROWTYPE;
i INTEGER;
moy REAL := 0;
BEGIN
FOR nuplet IN notes_stockees LOOP
notes.EXTEND;
notes(notes.COUNT) := nuplet.notecc;
DBMS_OUTPUT.PUT_LINE('notes(' || notes.count || ') = ' ||
nuplet.notecc);
END LOOP;
notes.delete(1);
notes.delete(10);
notes.delete(16);
DBMS_OUTPUT.PUT_LINE('Indice premier : ' || notes.FIRST);
DBMS_OUTPUT.PUT_LINE('Indice dernier : ' || notes.LAST);
DBMS_OUTPUT.PUT_LINE('Nombre éléments : ' || notes.COUNT);
i := notes.FIRST;
WHILE i <= notes.LAST LOOP
DBMS_OUTPUT.PUT_LINE('notes(' || i || ') = ' || notes(i));
i := notes.NEXT(i);
END LOOP;
END;
-- Exercice 3
DECLARE
TYPE Employe IS RECORD(
nom emp.ename%TYPE,
fonction emp.job%TYPE,
salaire_tot emp.sal%TYPE);
e Employe;
CURSOR c(nod NUMBER) IS
SELECT ename, job, sal + NVL(comm, 0)
FROM emp
WHERE deptno = nod;
BEGIN
OPEN c(30);
FETCH c INTO e;
WHILE c%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(e.nom || ' (' || e.fonction || ') : ' ||
e.salaire_tot || ' €');
FETCH c INTO e;
END LOOP;
CLOSE c;
END;