Si la définition d’une procédure stockée, d’une fonction stockée, d’un paquetage, d’un corps de paquetage
ou d’un déclencheur est incorrecte, Oracle indique la création « avec des erreurs de compilation », sans plus
de précision. Pour visualiser les erreurs, utiliser la commande suivante.
SHOW ERRORS
1. Reprendre le bloc PL/SQL anonyme permettant d’afficher le nom et le prix des 5 produits les plus chers
de la table DEMO_PRODUCT_INFO (TD n° 1, Exercice 3) et le transformer en procédure stockée.
3. Modifier la procédure stockée pour qu’elle affiche les k produits les plus chers.
4. Tester l’exécution de la procédure stockée avec plusieurs valeurs de k (dont des valeurs supérieures à
10).
Exercice 2 : Paquetage
4. Ajouter à la spécification et au corps du paquetage statepack une procédure nommée display (sans
paramètre) qui affiche tous les états à l’écran dans le format désiré. Dans le code de la procédure display,
utiliser le curseur statelist et une variable enregistrement locale de type statetuple. Tester la procédure
(EXECUTE statepack.display ou BEGIN statepack.display; END;).
5. Ajouter à la spécification et au corps du paquetage statepack une procédure nommée add qui insère dans
la table DEMO_STATES un nouvel état dont le code ST et le nom sont passés en paramètres. Tester la
procédure.
6. Ajouter à la spécification et au corps du paquetage statepack une procédure nommée mod qui modifie
dans la table DEMO_STATES l’état dont le code ST et le nouveau nom sont passés en paramètres. Tester
la procédure.
8. Ajouter uniquement au corps du paquetage statepack une fonction nommée statecount qui renvoie le
nombre d’états dans la table DEMO_STATES. Tester la fonction depuis l’extérieur du paquetage (EXECUTE
DBMS_OUTPUT.PUT_LINE(statepack.statecount)). Conclusion ?
-- Exercice 1
BEGIN
OPEN ranking;
FETCH ranking INTO p; -- Premier produit
WHILE ranking%FOUND AND ranking%ROWCOUNT <= k LOOP
DBMS_OUTPUT.PUT_LINE(ranking%ROWCOUNT || ') ' || p.product_name ||
' : ' || p.list_price || ' €');
FETCH ranking INTO p; -- Produit suivant
END LOOP;
CLOSE ranking;
END;
-- Exercice 2
-- Spécification du paquetage
PROCEDURE display;
PROCEDURE add(
code demo_states.st%TYPE,
name demo_states.state_name%TYPE);
PROCEDURE mod(
code demo_states.st%TYPE,
newname demo_states.state_name%TYPE);
PROCEDURE display IS
s statetuple;
BEGIN
FOR s IN statelist LOOP
DBMS_OUTPUT.PUT_LINE(s.code || ': ' || s.name);
END LOOP;
DBMS_OUTPUT.PUT_LINE(statecount || ' state(s)');
END;
PROCEDURE add(
code demo_states.st%TYPE,
name demo_states.state_name%TYPE) IS
BEGIN
INSERT INTO demo_states VALUES(code, name);
END;
PROCEDURE mod(
code demo_states.st%TYPE,
newname demo_states.state_name%TYPE) IS
BEGIN
UPDATE demo_states SET state_name = newname WHERE st = code;
END;
-- Tests
EXECUTE statepack.display
EXECUTE statepack.add('ZZ', 'test')
EXECUTE statepack.display
EXECUTE statepack.mod('ZZ', 'test plus long')
EXECUTE statepack.display
EXECUTE statepack.del('ZZ')
EXECUTE statepack.display
EXECUTE DBMS_OUTPUT.PUT_LINE(statepack.statecount) -- ne fonctionne pas
EXECUTE statepack.display