Base de donees
Feuille de TD4 Bases de donn´es relationnelles e langage PL/SQL R.Chiky, Z. Kazi Aoul, M. Manceny
14 avril 2010
Nous rappelons ici le sch´ma de la base de donn´es impl´ment´e en TP: e e e e
Ecrivez un bloc PL/SQL qui permet de connaˆ ıtre les cinq ouvrages les plus emprunt´s. L’utilisateur verra affich´: e e Numero Numero Numero Numero Numero 1: 2: 3: 4: 5: isbn isbn isbn isbn isbn : : : : : 126578753 676809876 987654398 876098790 546782333
1.1
Correction
DECLARE CURSOR couvrages IS SELECT isbn, count(*) AS NombreEmprunts FROM details GROUP BY isbn ORDER BY 2 DESC; vouvrage couvrages%rowtype; i number; BEGIN OPEN couvrages; i:=0; LOOP i:=i+1; EXIT WHEN i>5; FETCH couvrages INTO vouvrage; EXIT WHEN couvrages%notfound; DBMS_OUTPUT.PUT_LINE(’Numero: ’||i||’ isbn:’ || vouvrage.isbn); END LOOP; CLOSE couvrages; END; /
2
Fonctions: Dur´e moyenne e
Figure 1: Sch´ma de la base de donn´es e e A partir de ce sch´ma, r´pondez aux exercices PL/SQL suivants: e e
Ecrivez une fonction dureeMoyenne qui accepte en param`tre un num´ro e e d’ISBN et ´ventuellement un num´ro d’exemplaire et qui retourne, soit la dur´e e e e moyenne d’emprunt de l’ouvrage (seul le num´ro d’ISBN est connu), soit la e dur´e moyenne d’emprunt de l’exemplaire dans le cas o` l’on connait la num´ro e u e d’ISBN et le num´ro d’exemplaire. e
2.1
Correction
CREATE OR REPLACE FUNCTION dureeMoyenne( 1 2
visbn in number, vexemplaire in number default null) RETURN number IS vduree number; BEGIN IF (vexemplaire is null) THEN SELECT AVG(rendule-creele) INTO vduree FROM emprunts, details WHERE emprunts.numero=details.emprunt AND details.isbn=visbn AND rendule is not null; ELSE SELECT AVG(rendule-creele) INTO vduree FROM emprunts, details WHERE emprunts.numero=details.emprunt AND details.isbn=visbn AND details.exemplaire=vexemplaire AND rendule is not null; END IF; RETURN vduree; END; /
WHERE isbn=visbn AND exemplaire=vnumero ; IF