Vous êtes sur la page 1sur 3

Année 2019/2020

Deuxième semestre
Département INFORMATIQUE DUT année spéciale

Travaux Pratiques et Dirigés de Bases de Données n˚ 3


PL/SQL : procédures stockées, déclencheurs

Les exercices de ce TD font référence à la base de données « Vidéothèque ».

1. Ecrire, compiler et stocker une fonction nbreFilms qui, étant donné un réalisateur (identifié par son
numéro d’individu), renvoie le nombre total de films qu’il a tourné.
Testez la fonction nbreFilms avec le réalisateur numéro 1091.

2. Transformer le bloc PL/SQL de la question 5.c) du TD 2 en une procédure stockée majBonus, qui
prend deux paramètres entiers nbre1 et nbre2. Attention, votre procédure doit mettre à jour l’attribut
bonus de la table tableBonus, et ne doit rien afficher.
Testez votre procédure avec les valeurs 3 et 4.

3. Statistiques pour la Vidéothèque


a. Ecrire et compiler une fonction stockée Pourcentage, qui prend en paramètre deux entiers n1
et n2, et qui retourne le nombre réel (n1 / n2)*100 arrondi à deux chiffres après la virgule.
b. Ecrire et compiler une fonction stockée nbrExSupport, qui prend en paramètre un numéro
de film n (de type numFilm dans ens2004.exemplaire) et un code de support c pour un
exemplaire de film (de type codeSupport dans ens2004.exemplaire), et qui retourne le
nombre d’exemplaires du film n dont le support est c. En outre, si le paramètre c vaut
« ANY », la fonction nbrExSupport doit retourner le nombre d’exemplaires du film n quel
que soit leur support (il est demandé de gérer cela par une exception).
c. Créer une table statistiques (numFilm, nbrEx, pctgeDVD, pctgeVHS) où nbrEx est un entier
et pctgeDVD, pctgeVHS sont des réels.
d. Ecrire et compiler une procédure remplirStat qui remplit la table statistiques, que l’on sup-
posera initialement vide. Une fois la procédure remplirStat exécutée, la table statistiques
doit donner pour chaque film le nombre d’exemplaires de ce film, ainsi que le pourcentage
d’exemplaires de type DVD et de type VHS.

4. Afin d’améliorer le service et la gestion de son stock, la vidéothèque souhaite avoir à sa disposition à
tout moment une série de données statistiques relatives à sa base. Créer un package statistics qui ras-
semble les procédures et fonctions permettant de savoir :
a. Le nombre de films pour lesquels on ne possède aucun exemplaire.
b. Le pourcentage d’exemplaires pour lesquels on n’a jamais signalé de problème.

5. On crée une table trace(numLog, message), où numLog est un entier et message une chaîne de carac-
tères. Soit nbValLog la fonction qui compte le nombre de lignes de la table trace définie par :

CREATE OR REPLACE FUNCTION nbValLog RETURN INTEGER AS


nbval INTEGER;
BEGIN
SELECT COUNT(*) INTO nbval FROM TRACE; RETURN nbval;
END;
/

Page 1 Bases de données – TD 3


Année 2019/2020
Deuxième semestre
Département INFORMATIQUE DUT année spéciale

On considère maintenant les quatre déclencheurs suivants :

Déclencheur TRIG_1 Déclencheur TRIG_2


CREATE TRIGGER TRIG_1 CREATE TRIGGER TRIG_2
BEFORE INSERT ON LOCATION BEFORE INSERT ON LOCATION
FOR EACH ROW
BEGIN BEGIN
INSERT INTO TRACE INSERT INTO TRACE
VALUES(nbValLog+1,'Trigger 1'); VALUES(nbValLog+1,'Trigger 2');
END; END;
/ /
Déclencheur TRIG_3 Déclencheur TRIG_4
CREATE TRIGGER TRIG_3 CREATE TRIGGER TRIG_4
AFTER INSERT ON LOCATION AFTER INSERT ON LOCATION
FOR EACH ROW
BEGIN BEGIN
INSERT INTO TRACE INSERT INTO TRACE
VALUES(nbValLog+1,'Trigger 3'); VALUES(nbValLog+1,'Trigger 4');
END; END;
/ /

Lors d’une insertion dans la table location, quelles valeurs sont ajoutées dans la table trace ? Que
peut-on en déduire sur l’ordre d’activation des déclencheurs d’une même table, en fonction de leurs
types ?

6. Créer un déclencheur qui empêche la suppression d’une ligne de la table location par une personne
non autorisée, et qui envoie un message d’alerte à l’écran, comme par exemple « Attention, utilisa-
teur non autorisé ! ».

7. Ecrire un déclencheur qui, suite à la modification d’une ligne de la table location :


a. Refuse la suppression si la date d’envoi de l’exemplaire était renseignée ;
b. Refuse la mise à jour (ou insertion) qui aboutit à une location dont on connait la date de re-
tour et dont on ignore la date d’envoi ;
c. Dans tous les autres cas, fait afficher un message précisant ce qui a été fait et pour
quel login, numéro d’exemplaire et date de location (dans le cas d’une mise à jour les an-
ciens et nouveaux valeurs de ce trois champs doivent être affichés).

8. On souhaite définir un déclencheur trigBonus qui après chaque insertion dans la table location, met
à jour d’une part l’attribut nbrExLoues, et d’autre part l’attribut bonus de la table tablebonus ; en
particulier, trigBonus doit mettre à jour le bonus selon les règles de la question 2 ci-dessus.
Afin de répondre à la première partie de la question précédente, concernant la mise à jour de
nbrExLoues, on pourrait souhaiter écrire le déclencheur suivant :

CREATE OR REPLACE TRIGGER trigBonus


AFTER INSERT ON LOCATION
FOR EACH ROW
DECLARE
nbre TABLEBONUS.nbrExLoues%type;
BEGIN
SELECT COUNT(*) INTO nbre FROM LOCATION
WHERE login = :NEW.login;
UPDATE TABLEBONUS

Page 2 Bases de données – TD 3


Année 2019/2020
Deuxième semestre
Département INFORMATIQUE DUT année spéciale

SET nbrExLoues = nbre+1 WHERE login = :NEW.login;


END;
/

a. Que se passe-t-il avec ce déclencheur, lors d’une insertion dans la table location ? Pourquoi
ne fonctionne-t-il pas comme on l’attend ? Comment s’appelle ce phénomène ?
b. Ecrire « correctement » le déclencheur trigBonus.

Page 3 Bases de données – TD 3