Vous êtes sur la page 1sur 4

M1 IDSM-Kharkiv – Année 2019-2020

Bases de données avancées


Examen
J. Darmont (http://eric.univ-lyon2.fr/jdarmont/), 28/09/2019

Durée : 2 heures – Documents autorisés – Barème fourni à titre indicatif

Exercice 1 : Modélisation conceptuelle (5 points)

Le directeur d’un campus sportif veut gérer les réservations de terrains de sport. Proposer un
diagramme de classes UML à partir des spécifications ci-dessous.

Un terrain est caractérisé par un numéro de terrain, un nom, un type (gymnase, stade…) et une surface.
Sur un terrain, on peut faire plusieurs sports (par exemple, hand-ball, basket-ball et volley-ball dans un
gymnase).

Un sport est identifié par un code unique composé de trois lettres, et le nom complet du sport.

Les adhérents du campus sportif sont identifiés par un numéro d’adhérent, un nom, un prénom, un
numéro de téléphone et une adresse e-mail. Ils font des réservations.

Une réservation est identifiée par un numéro unique, un jour, une heure de début et une heure de fin.
Une réservation concerne un terrain et un sport précis.

Exercice 2 : Requêtes SQL (5 points)

Le schéma relationnel de la base de données « cinéma » est donné ci-dessous.


Ville (CodePostal, NomVille)
Cinéma (NumCiné, NomCiné, Adresse, CodePostal#)
Salle (NumSalle, Capacité, NumCiné#) Clés primaires
Distributeur (CodeDist, NomDist) Clés étrangères#
Film (NumExploit, Titre, Durée, CodeDist#)
Projection (NumProj, NumExploit#, NumSalle#, NumSemaine, NombreEntrées)

Écrire en SQL les requêtes suivantes.


1. Titre des films dont la durée est comprise entre une heure et demie et deux heures.
2. Nom de la ville, nom du cinéma, numéro et capacité de la salle. Trier le résultat par ville, cinéma et
numéro de salle croissants.
3. Durée moyenne des films.
4. Nombre total d’entrées par cinéma (indiquer le nom du cinéma). Trier par nombre total d’entrées
décroissant.
5. Titre des films qui ne sont pas en projection actuellement.

M1 IDSM – Bases de données avancées – Examen 1/2


Exercice 3 : Programmation PL/SQL (10 points)

Le schéma relationnel de la base de données « events » est donné ci-dessous.


Event (eventNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience)
Employee (empNo, empName, empDepartment, empPhone, empEmail)
EventPlan (planNo, eventNo#, workdate, notes, activity, empNo#)

1. Écrire un bloc PL/SQL anonyme qui calcule le nombre d’événements nAll dans la table Events et le
nombre d’événements nNot dont le statut (status) n’est pas « Approved ». Si nAll ≠ 0, afficher la valeur
nNot ÷ nAll, sinon afficher « Aucun événement » pour éviter une division par zéro.

2. Écrire une procédure stockée de nom showPlan, qui a comme paramètre un numéro de planification
no. Si le numéro de planification no n’existe pas dans la table EventPlan, déclenchez une exception. La
procédure doit ensuite afficher toutes les caractéristiques de la planification (EventPlan) dont le numéro
(planNo) est égal à no. Si vous n’arrivez pas à écrire une procédure stockée, écrivez un bloc
PL/SQL anonyme et affichez la planification de numéro « P100 ».

3. Écrire un bloc PL/SQL anonyme qui affiche les numéros des planifications où la date indiquée
(workdate) est différente de la date (dateHeld) à laquelle s’est déroulé l’événement (Event)
correspondant.

4. Pour éviter à l’avenir la vérification de la question 3, écrire un déclencheur de nom setDate sur la
table EventPlan, qui affecte automatiquement à workdate la valeur de dateHeld de l’événement associé.

M1 IDSM – Bases de données avancées – Examen 2/2


Correction exercice 1

Correction exercice 2

-- 1
SELECT Titre
FROM Film
WHERE Durée BETWEEN 1.5 AND 2

-- 2
SELECT NomVille, NomCiné, NumSalle, Capacité
FROM Ville V, Cinéma C, Salle S
WHERE V.CodePostal = C.CodePostal
AND C.NumCiné = S.NumCiné
ORDER BY NomVille, NomCiné, NumSalle

-- 3
SELECT AVG(Durée)
FROM Film

-- 4
SELECT NomCiné, SUM(NombreEntrées) TotalEntrées
FROM Cinéma C, Salle S, Projecion P
WHERE C.NumCiné = S.NumCiné
AND S.NumSalle = P.NumSalle
GROUP BY NomCiné
ORDER BY TotalEntrées DESC

-- 5
SELECT Titre SELECT Titre
FROM Film FROM Film F
WHERE NumExploit NOT IN( WHERE NOT EXISTS(
SELECT NumExploit SELECT *
FROM Projection) FROM Projection P
WHERE F.NumExploit = P.NumExploit)

M1 IDSM – Bases de données avancées – Examen 3/2


Correction exercice 3

-- 1
DECLARE
nAll INTEGER;
nNot INTEGER;
BEGIN
SELECT COUNT(*) INTO nAll FROM Event;
SELECT COUNT(*) INTO nNot FROM Event WHERE status <> 'Approved';
IF nALl <> 0 THEN
DBMS_OUTPUT.PUT_LINE(nNot / nAll);
ELSE
DBMS_OUTPUT.PUT_LINE('Aucun événement');
END IF;
END;

-- 2
CREATE OR REPLACE PROCEDURE showPlan(no VARCHAR) AS
plan EventPlan%ROWTYPE;
n INTEGER;
noIncorrect EXCEPTION;
BEGIN
-- Test d'existence du numéro de planification
SELECT COUNT(*) INTO n FROM EventPlan WHERE planNo = no;
IF n = 0 THEN
RAISE noIncorrect;
END IF;
-- Récupération des informations de planification
SELECT * INTO plan FROM EventPlan WHERE planNo = no;
DBMS_OUTPUT.PUT(plan.planNo || ' ');
DBMS_OUTPUT.PUT(plan.eventNo || ' ');
DBMS_OUTPUT.PUT(plan.workdate || ' ');
DBMS_OUTPUT.PUT(plan.notes || ' ');
DBMS_OUTPUT.PUT(plan.activity || ' ');
DBMS_OUTPUT.PUT_LINE(plan.empno);
EXCEPTION
WHEN noIncorrect THEN
RAISE_APPLICATION_ERROR(-20501, 'Numéro de planification inconnu');
END;

-- 3
DECLARE
CURSOR curs IS SELECT planNo FROM EventPlan P, Event E
WHERE P.eventNo = E.EventNo AND workdate <> dateHeld;
nuplet curs%ROWTYPE;
BEGIN
FOR nuplet IN curs LOOP
DBMS_OUTPUT.PUT_LINE(nuplet.planNo);
END LOOP;
END;

-- 4
CREATE OR REPLACE TRIGGER setDate
BEFORE INSERT OR UPDATE ON EventPLan
FOR EACH ROW
BEGIN
SELECT dateHeld INTO :NEW.workdate FROM Event WHERE eventNo = :NEW.eventNo;
END;

M1 IDSM – Bases de données avancées – Examen 4/2

Vous aimerez peut-être aussi