• Aucun résultat trouvé

Dans un bloc PL/SQL anonyme, définir un type tableau (VARRAY) de réels de taille 10 qui contiendra des notes d’examen

N/A
N/A
Protected

Academic year: 2022

Partager "Dans un bloc PL/SQL anonyme, définir un type tableau (VARRAY) de réels de taille 10 qui contiendra des notes d’examen"

Copied!
4
0
0

Texte intégral

(1)

M1 Informatique – Bases de données avancées – TD 2 1/2 M1 Informatique – Année 2017-2018

Bases de données avancées

TD n° 2 (PL/SQL) : Types de données abstraits J. Darmont (http://eric.univ-lyon2.fr/~jdarmont/), 24/08/17

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 ! 4. Calculer et afficher la moyenne des notes.

5. Ajouter encore une note dans le tableau. Que se passe-t-il ? 6. Afficher la taille maximum et la taille réelle du tableau.

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.

Exercice 2 : Liste et curseur implicite

1. Recopier la table DARMONT.NOTATION sur votre compte.

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.

3. Définir une variable de ce type et l’initialiser à vide.

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 ? 5. Calculer et afficher la moyenne des notes contenues dans la liste.

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.

8. Supprimer les éléments d’indice 1, 10 et 16, puis répéter la question 7 (copier/coller).

9. Afficher tous les éléments de la collection.

(2)

M1 Informatique – Bases de données avancées – TD 2 2/2 Exercice 3 : Enregistrement et curseur paramétré

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.

2. Définir une variable (un enregistrement) de ce type.

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

(3)

M1 Informatique – Bases de données avancées – TD 2 3/2 Correction

-- 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;

FOR i IN 1..notes.COUNT LOOP moy := moy + notes(i);

END LOOP;

DBMS_OUTPUT.PUT_LINE('Moyenne = ' || moy / notes.COUNT);

-- notes.EXTEND; NE FONCTIONNE PLUS (taille maxi = 10) -- notes(11) := 20;

DBMS_OUTPUT.PUT_LINE('Taille actuelle / Taille limite = '

||notes.COUNT||' / '||notes.LIMIT);

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;

FOR i IN 1..notes.COUNT LOOP moy := moy + notes(i);

END LOOP;

DBMS_OUTPUT.PUT_LINE('Moyenne = ' || moy / notes.COUNT);

(4)

M1 Informatique – Bases de données avancées – TD 2 4/2 SELECT AVG(notecc) INTO moy FROM notation;

DBMS_OUTPUT.PUT_LINE('AVG(notecc) = ' || moy);

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);

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;

Références

Documents relatifs

– la valeur de chaque colonne du Select doit être stockée dans une variable réceptrice définie dans la partie Declare du bloc/. FETCH nomcurseur INTO liste_variables

3.5 Créer un document comportant un élément DIV qui pourra glisser sur une ligne horizontale, vous utiliserez un lien pour démarrer et arrêter l’animation (le mouvement sera

Modifier la procédure donner_max_emp afin de lever une erreur d’application lorsque l’identifiant du client passé en paramètre est invalide... Charger la nouvelle version de

Le 10 e congrès annuel de la Société francophone de santé et environnement (SFSE) avec pour thème « Les inégalités socio-environnementales de santé : pour une

La 6 e réunion du groupe d’étude ESCMID pour les infections à Legionella (ESGLI) aura lieu du 10 au 12 septembre 2019 à Athènes, Grèce.. Pour plus de

La conférence se déroulera du 28 juillet au 2 août 2019 à South Hadle, États-Unis, avec pour thème « Trouver des solutions aux pro- blèmes émergents des sous-produits de

Pour les blocs PL/SQL intégralement transmis à la base de données, la partie relative au traitement des instructions conditionnelles est effectuée par le

Opening the cursor allocates memory for the cursor and makes it ready for fetching the rows returned by the SQL statement into it. For example, we will open above-defined cursor