TD 13

Transcription

TD 13
Année 2014/2015
Premier semestre
DUT FC Air France
Département INFORMATIQUE
Travaux Pratiques et Dirigés de Bases de Données n˚ 13
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 3.c) du TD 12 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 supposera 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 société Vidéoscope souhaite avoir à sa disposition à tout moment une série de données statistiques relatives à sa base. Créer un package statistics qui rassemble 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 caractè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;
/
On considère maintenant les quatre déclencheurs suivants :
Page 1
Bases de données – TD 13
Année 2014/2015
Premier semestre
Département INFORMATIQUE
Déclencheur TRIG_1
CREATE TRIGGER TRIG_1
BEFORE INSERT ON LOCATION
FOR EACH ROW
BEGIN
INSERT INTO TRACE
VALUES(nbValLog+1,'Trigger 1');
END;
/
Déclencheur TRIG_3
CREATE TRIGGER TRIG_3
AFTER INSERT ON LOCATION
FOR EACH ROW
BEGIN
INSERT INTO TRACE
VALUES(nbValLog+1,'Trigger 3');
END;
/
DUT FC Air France
Déclencheur TRIG_2
CREATE TRIGGER TRIG_2
BEFORE INSERT ON LOCATION
BEGIN
INSERT INTO TRACE
VALUES(nbValLog+1,'Trigger 2');
END;
/
Déclencheur TRIG_4
CREATE TRIGGER TRIG_4
AFTER INSERT ON LOCATION
BEGIN
INSERT INTO TRACE
VALUES(nbValLog+1,'Trigger 4');
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,
utilisateur non autorisé ! ».
7. 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
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 le déclencheur trigBonus. Pour simplifier, on pourra supposer que tous les logins
de clients figurent dans la table TABLEBONUS avant l’insertion dans LOCATION.
Page 2
Bases de données – TD 13