L6 Ex 1, 2, 3
- Écrivez un bloc PL / SQL qui utilise une collectionTABLE pour stocker les noms des étudiants du tableau STUD.
La collection est remplie à l’aide d’un curseur qui renvoie les noms des étudiants d’une spécialisationdont le code (CODS) est stocké dans une constante.
Après le téléchargement des données, le contenu de la collection est affiché avec une boucle FOR. Le nombre d’éléments est renvoyé par la méthode COUNT.
2. As 1 mais le contenu est affiché en utilisant une boucle LOOP et un compteur numérique.
3. Comme 2 mais la navigation se fait à l’aide des méthodes associées (FIRST, NEXT, …)
DECLARE
TYPE TabNoms IS TABLE OF stud.nume%TYPE;
noms TabNoms := TabNoms();
spec number := 11;
i number;
CURSOR c IS SELECT nume FROM stud where cods = spec;
BEGIN
i :=0;
FOR v IN c LOOP
i := i + 1;
noms.extend(1);
noms(i) := v.nume;
END LOOP;
dbms_output.put_line(i || ' ' || noms.count);
-- EX 1
FOR i IN 1..noms.count loop
dbms_output.put_line(i || ' ' || noms(i));
END LOOP;
-- EX 2
i := 1;
LOOP
dbms_output.put_line(i || ' - ' || noms(i));
i := i+1;
EXIT WHEN i > noms.count;
END LOOP;
-- EX 3
i := noms.FIRST;
LOOP
dbms_output.put_line(i || ' - ' || noms(i));
i := noms.NEXT(i);
EXIT WHEN i IS NULL;
END LOOP;
--
END;
L6 Ex 4
Comme 1 mais utilisez BULK_COLLECT pour lire dans la variable le résultat renvoyé par le curseur avec une seule instruction
DECLARE
TYPE TabNoms IS TABLE OF stud.nume%TYPE;
noms TabNoms := TabNoms();
spec number := 11;
i number;
CURSOR c IS SELECT nume FROM stud where cods = spec;
BEGIN
-- EX 4
OPEN c;
FETCH c BULK COLLECT INTO noms;
dbms_output.put_line(i || ' ' || noms.count);
-- EX 1
FOR i IN 1..noms.count loop
dbms_output.put_line(i || ' ' || noms(i));
END LOOP;
END;
L6 Ex 5
Comme 4 mais seulement 2 lignes (LIMIT 2) sont chargées à chaque itération (transparent 38-39)
DECLARE
TYPE TabNoms IS TABLE OF stud.nume%TYPE;
noms TabNoms := TabNoms();
spec number := 24;
i number;
CURSOR c IS SELECT nume FROM stud where cods = spec;
BEGIN
-- EX 5
OPEN c;
LOOP
FETCH c BULK COLLECT INTO noms LIMIT 3;
EXIT WHEN c%NOTFOUND;
FOR i IN 1..noms.count loop
dbms_output.put_line(i || ' ' || noms(i));
END LOOP;
-- EXIT WHEN c%NOTFOUND;
END LOOP;
END;
L6 Ex 6
Prendre dans un TABLEAU les codes destuteurs, pour augmenter de 10% leur score à l’aide d’un FORALL.
update stud set punctaj = 1000
DECLARE
TYPE TabCodes IS VARRAY(10) OF NUMBER;
TYPE TabNoms IS TABLE OF stud.nume%TYPE;
codes TabCodes;
noms TabNoms;
k number;
BEGIN
SELECT tutor, nume BULK COLLECT INTO codes, noms
FROM stud WHERE TUTOR IS NOT NULL;
dbms_output.put_line('No etudiants = ' || codes.count);
FORALL i IN 1 ..codes.count
UPDATE stud
SET punctaj = punctaj * 1.10
WHERE matr = codes(i);
FOR k IN 1..codes.count loop
dbms_output.put_line('Iteration, on a modifie ' || SQL%BULK_ROWCOUNT(k) || ' lignes pour le tuteur de ' || noms(k));
END LOOP;
END;
SELECT nume, punctaj FROM stud
Pour chacun des exercices ci-dessus, écrivez la version qui utilise un VARRAY et non un TABLE.