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