Examen Corrige SGBD nfp107 2014
Examen Corrige SGBD nfp107 2014
Examen Corrige SGBD nfp107 2014
Abdallah EL Asmar
Q1. Définir un bloc PL/SQL nommé qui affiche pour chaque programme, les numéros des
invités qui ont participé à la dernière émission.
1ère solution:
Cette solution consiste à :
- Créer un curseur pour trouver les numéros et les noms de tous les programmes qui ont
des émissions,
- Trouver la dernière date d’émission d’un programme
- Créer un curseur paramétré qui prend en argument un numéro d’un programme et la
dernière date d’émission de ce programme.
1/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
2ème solution:
La seule différence avec la 1ère solution est l’utilisation d’une requête imbriquée dans la
définition du deuxième curseur pour trouver la dernière date d’émission d’un programme.
3ème solution:
Cette solution consiste à trouver les numéros et les noms de tous les programmes et à appeler
pour chaque programme une procédure permettant d’afficher les invités de la dernière
émission de ce programme.
2/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
cursor lesInvites is
select p.noInv
from Emissions e, Participe p
where e.noEm = p.noEm
and e.noProg = Num
and e.dateEmission = (Select max (dateEmission)
From Emissions
Where noProg = Num);
Begin
For C in lesInvites loop
Dbms_output.put_line (C.noInv) ;
End loop;
End;
/
4ème solution:
Cette solution consiste à créer une seule requête pour trouver le résultat.
Q2. Définir un bloc PL/SQL nommé qui affiche les numéros et les noms des présentateurs
principaux qui ont présenté un seul programme.
Solution:
La solution consiste à créer un curseur permettant de trouver le numéro et le nom de tout
présentateur si ce présentateur est le présentateur principal d’un seul programme. Pour
exprimer cette condition, on peut utiliser une requête imbriquée permettant de vérifier si le
nombre de programmes présentés par un présentateur est égal à 1.
3/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
La requête du curseur peut être définie directement sans utiliser une requête imbriquée :
cursor unProg is
select p.noPres, p.nom
from Presentateurs p, Programmes g
where p.noPres = g.noPresPrincipal
group by p.noPres, p.nom
having count(*) = 1;
Q3. Définir un programme PL/SQL nommé permettant de savoir si deux invités ont participé à
des émissions chez les mêmes présentateurs principaux.
1ère Solution:
Ecrire une fonction qui prend en argument les noInv de deux invités function Q3(inv1 integer,
inv2 integer) et qui retourne true si ces invités ont participé à des émissions des mêmes
présentateurs principaux; si non, elle retourne false.
Trouver le nombre de présentateurs principaux dont le premier invité a participé à leurs
émissions et le deuxième invité n’a pas participé à ces émissions:
Select count(distinct noPresPrincipal) into Nb1
from Programmes p, Emissions e, Participe a
where p.noProg = e.noProg and e.noEm = a.noEm
and a.noInv = inv1
and noPresPrincipal not int (Select noPresPrincipal
from Programmes p, Emissions e, Participe a
where p.noProg = e.noProg and e.noEm = a.noEm
and a.noInv = inv2);
4/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
Abdallah EL Asmar
2ème Solution:
Au lieu de trouver le nombre de présentateurs principaux pour chacun des invités, on cherche
les numéros de présentateurs principaux pour chacun d’eux et on fait une comparaison pour
vérifier s’il s’agit des mêmes présentateurs.
Cursor invite2 is
Select distinct noPresPrincipal
from Programmes p, Emissions e, Participe a
where p.noProg = e.noProg and e.noEm = a.noEm
and a.noInv = inv2
order by noPresPrincipal;
P1 integer;
P2 integer;
Begin
Open invite1;
Open invite2;
Loop
Fetch invite1 into p1;
Fetch invite2 into p2;
If (invite1%notfound and invite2%notfound) return true; end if;
If (invite1%notfound or invite2%notfound) return false; end if;
If (p1 != p2) return false; end if;
End loop;
End;
/
Q4. Définir un bloc PL/SQL nommé affichant les noms des programmes dont la durée totale de
toutes ses émissions est la plus longue.
1ère Solution:
Créer un curseur pour trouver la durée totale des émissions de chaque programme, parcourir
le curseur et comparer la durée de chaque programme avec la durée la plus longue afin
d’afficher le nom de ce programme s’il possède la durée la plus longue.
Durée totale des émissions d’un programme = nombre des émissions du programme
multiplié par la durée du programme.
6/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
2ème Solution:
Calculer la durée la plus longue comme une requête imbriquée dans la définition du curseur.
7/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
Q5. Définir un programme PL/SQL nommé permettant d’afficher les noms des invités qui ont
participé à tous les programmes.
1ère Solution:
Même raisonnement que Q4 ; créer un curseur permettant de trouver pour chaque invité le
nombre de programmes dont il a participé, parcourir ce curseur et comparer le nombre de
programmes de chaque invité avec le nombre total de programmes.
2ème Solution:
Créer un curseur permettant de trouver chaque invité si le nombre de programmes dont il a
participé, est égal le nombre total de programmes.
8/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
Exercice 2 : (2 pts)
Considérons le schéma relationnel suivant :
Websites (idweb, url, #nbvisite)
Langues (idlang, description)
Pages (idpage, nom,#idlang, #idweb)
Membres (idmemb, nom, prenom, login, adresse)
visites (idvisit, datev, duree, #idpage, #idmemb)
Solution:
Pour trouver un plan logique optimal, on applique un algorithme permettant de réduire le plus
rapidement possible la taille des relations manipulées. Donc :
1. On effectue les sélections (σ) d’abord car on considère que c’est l’opérateur le plus “réducteur”.
2. On élimine dès que possible les attributs inutiles par projection (π).
3. Enfin on effectue les jointures ().
π nom, prenom
adresse
V2 M2 M1 V1 P
9/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
1 4 10 13 17 77
2 5 11 14 26 88
3 6 12 15 55
Arbre B+ d’ordre 2
Chaque nœud de l’arbre (à l’exception de la racine) doit contenir N articles tel que K <= N <=2K
(K est l’ordre de l’arbre). Les feuilles sont enchainées (chaque feuille contient l’adresse de la feuille
suivante) et elles contiennent les clés des articles avec les adresses de pages où se trouvent les articles
ou les articles eux-mêmes (cas exceptionnel où les articles et l’index sont sauvegardés ensemble).
Les autres nœuds contiennent les clés des articles avec les adresses de nœud-enfants.
12
3 5 15 26
1 2 3 4 5 6 10 11 12 13 14 15 17 26 55 77 88
Q2. Nous supposons que la taille d’une ligne est 35 octet dont 6 est dédiée à la clé, l’adresse
d’une ligne est 2 octet et l’adresse d’une page est 3 octet. Calculer les tailles des indexes
donné dans la question Q1.
Solution
Taille de l’index non-dense
L’index contient 6 entrées, alors :
Taille de l’index = 6 * (taille de clé + taille de l’adresse de page)
= 6 * (6 + 3) = 54 octets.
Taille de l’arbre B+
L’arbre contient 3 niveaux :
Taille du 1er niveau (racine) = taille de clé + (2 * taille de l’adresse de page)
= 6 + ( 2 * 3) = 12 octets
10/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
Q3. Montrer l’évolution de l’index de type arbre B+ après suppression des clés suivantes :
d’abord 11, puis 12, puis 13.
Solution
La suppression de l’article de clé 11 n’implique pas de changement ;
La suppression de l’article de clé 12 implique le changement du contenu de racine : 10
remplace 12;
La suppression de l’article de clé 13 n’implique pas de changement ;
10
3 5 15 26
1 2 3 4 5 6 10 14 15 17 26 55 77 88
Solution
Les conflits:
Sur x: r1[x] -w3[x]
w1[x] -r3[x]
w1[x] -w3[x]
r3[x] –w1[x]
Sur y : Pas de conflits
Sur x: r3[z] –w2[z]
w2[z] –r1[z]
Graphe de Sérialisation
T2 T3
T1
11/12
ISAE – Beyrouth, Centre associé au CNAM-Paris
Systèmes de gestion de bases de données – NFP107–
Corrigé de l’examen final 2014
Abdallah EL Asmar
Solution
Verrouillage à 2 phases :
r1[x] Exécutée
r2[y] Exécutée
w3[x] Bloquée, T3 est mise en attente de T1
w1[y] Bloquée, T1 est mise en attente de T2
w1[x] Bloquée, (T1 est déjà en attente)
w2[y] Exécutée
c2 Commit de T2 Verrou de y est relâché T1 débloquée
w1[y] Exécutée
w1[x] Exécutée
r3[y] Bloquée, (T3 est déjà en attente)
r1[y] Exécutée
c1 Commit de T1 Verrous de x et y sont relâchés T3 débloquée
w3[x] Exécutée
r3[y] Exécutée
w3[y] Exécutée
c3 Commit de T3 Verrous de x et y sont relâchés T3 débloquée
Ordre d’exécution :
r1[x] r2[y] w2[y] c2 w1[y] w1[x] r1[y] c1 w3[x] r3[y] w3[y] c3
12/12