Vous êtes sur la page 1sur 8

Ministère de l'Enseignement Supérieur et de la recherche scientifique

******

Institut Supérieur des Etudes Technologiques de Kébili

******
‫لي‬SECTION : DSI2
ÉPREUVE : SGBD
CORRECTION D’EXAMEN SURVEILLÉ

Journée : Mercredi, Date : 11 MAI 2016 à 08h30

Enseignant : BELHASSEN ROCHDY


Durée : 1h30

ENSEIGNANTS (CODE_ENS, NOM_ENS, PREN_ENS, ADRESSE_ENS, NB_PFE_ENS)


PFE (CODE_PFE, TITRE_PFE, TYPE_PFE, #CODE_ENS, NB_ETU_PFE)
SOUTENANCE (CODE_SOUT, #CODE_PFE, DATE_SOUT, NOTE_PFE,
MENTION_SOUT, SESS)
ETUDIANTS (CODE_ETU, NOM_ETU, PREN_ETU, GRP_ETU , DATE_N_ETU,
ADRESSE_ETU, #CODE_PFE)

CREATE TABLE ETUDIANTS ( CREATE TABLE SOUTENANCE (


CODE_ETU VARCHAR2(6), CODE_SOUT VARCHAR2(6),
NOM_ETU VARCHAR2(15), CODE_PFE VARCHAR2(6),
PREN_ETU VARCHAR2(15), DATE_SOUT DATE,
GRP_ETU VARCHAR2(4), NOTE_PFE FLOAT,
DATE_N_ETU DATE, MENTION_SOUT VARCHAR2(15),
ADRESSE_ETU VARCHAR2(20), SESS VARCHAR2(15),
CODE_PFE VARCHAR2(6), PRIMARY KEY (CODE_SOUT),
PRIMARY KEY (CODE_ETU), FOREIGN KEY (CODE_PFE)
FOREIGN KEY (CODE_PFE) REFERENCES PFE (CODE_PFE)) ;
REFERENCES PFE (CODE_PFE)) ;
CREATE TABLE PFE ( CREATE TABLE ENSEIGNANTS (
CODE_PFE VARCHAR2(6), CODE_ENS VARCHAR2(6),
TITRE_PFE VARCHAR2 (15), NOM_ENS VARCHAR2 (15),
TYPE_PFE VARCHAR2 (15), PREN_ENS VARCHAR2 (15),
CODE_ENS VARCHAR2 (6), ADRESSE_ENS VARCHAR2 (20),
NB_ETU_PFE NUMBER, NB_PFE_ENS NUMBER,
PRIMARY KEY (CODE_PFE), PRIMARY KEY (CODE_ENS)) ;
FOREIGN KEY (CODE_ENS)
REFERENCES ENSEIGNANTS
(CODE_ENS)) ;
1) Créez une vue complexe nommée LISTE_ETUDIANTS_PFE formée par la liste
d’étudiants (CODE_ETU, NOM_ETU, PREN_ETU, GRP_ETU), leurs notes de PFE ainsi
que leurs mentions.

Correction d’Examen surveillé ---- SGBD ------- MAI 2016 DSI2 1


Cette vue doit empêcher l’ajout ou la modification non conforme.
1ère méthode
CREATE or replace VIEW LISTE_ETUDIANTS_PFE AS SELECT CODE_ETU
CODEETU, NOM_ETU NOMETU, PREN_ETU PRENETU, GRP_ETU GRPETU ,
NOTE_PFE NOTE, MENTION_SOUT MENTION
FROM ETUDIANTS E, SOUTENANCE S
WHERE E.CODE_PFE=S.CODE_PFE
WITH CHECK OPTION ;
2ème méthode
CREATE or replace VIEW LISTE_ETUDIANTS_PFE (CODEETU, NOMETU, PRENETU,
GRPETU , NOTE, MENTION)
AS SELECT CODE_ETU, NOM_ETU, PREN_ETU, GRP_ETU, NOTE_PFE,
MENTION_SOUT
FROM ETUDIANTS E, SOUTENANCE S
WHERE E.CODE_PFE=S.CODE_PFE
WITH CHECK OPTION ;
2) Ajoutez le privilège nécessaire pour rendre la vue LISTE_ETUDIANTS_PFE accessible
pour tous en écriture.
GRANT INSERT ON LISTE_ETUDIANTS_PFE TO PUBLIC ;
3) Ajoutez le privilège nécessaire pour rendre la vue LISTE_ETUDIANTS_PFE accessible
en lecture pour l’utilisateur ENCADREUR_3.
Grant select on LISTE_ETUDIANTS_PFE to ENCADREUR_3 ;
B/
1) Créez une vue complexe non modifiable nommée LISTE_PFE_ETUD_ENS avec des
alias (TITREPFE, NOMBRE_ETUD_PFE, NUMETU, NOMETU, PRENETU, NOMENS,
PRENENS) qui décrit la liste des PFE par étudiants par enseignant.
NOMBRE_ETUD_PFE : désigne le nombre des étudiants par PFE.
Solution:
CREATE OR REPLACE VIEW LISTE_PFE_ETUD_ENS
AS SELECT TITRE_PFE TITREPFE , COUNT (CODE_ETU) NOMBRE_ETUD_PFE,
CODE_ETU NUMETU, NOM_ETU NOMETU, NOM_ENS NOMENS, PREN_ENS
PRENENS
FROM PFE P, ENSEIGNANTS E1, ETUDIANTS E2
WHERE E1.CODE_ENS=P.CODE_ENS AND P.CODE_PFE=E2.CODE_PFE
GROUP BY TITRE_PFE, CODE_ETU, NOM_ETU, NOM_ENS, PREN_ENS
WITH READ ONLY ;

2) Créez un bloc PL/SQL qui utilise un curseur paramétré, la vue LISTE_PFE_ETUD_ENS


pour afficher :
 Afficher la liste de PFEs (TITRE_PFE) qui sont réalisés par trois étudiants et
encadrés par l’enseignante SOUMAYA KLACH.
 Afficher la liste de PFEs (TITRE_PFE) qui sont réalisés en monôme et encadrés par
l’enseignant HABIB JABEUR.

Correction d’Examen surveillé ---- SGBD ------- MAI 2016 DSI2 2


Solution:
DECLARE
CURSOR PF (NB NUMBER, NOM ENSEIGNANTS.NOM_ENS%TYPE, PRENOM
ENSEIGNANTS.PREN_ENS%TYPE) IS SELECT TITREPFE
FROM LISTE_PFE_ETUD_ENS
WHERE NOMBRE_ETUD_PFE =NB AND NOMENS=NOM AND PRENENS=PRENOM;
BEGIN
FOR P IN PF (3, ‘KLACH’, ‘SOUMAYA’) LOOP
DBMS_OUTPUT.PUT_LINE (RPAD( P.TITREPFE,14));
END LOOP;
DBMS_OUTPUT.PUT_LINE (‘------------------------------’) ;
FOR P IN PF (1, ‘JABEUR’, ‘HABIB’) LOOP
DBMS_OUTPUT.PUT_LINE (RPAD( P.TITREPFE,14));
END LOOP;
END ;
/

3) Refaire la question précédente en remplaçant le curseur paramétré par un curseur


typé ou un curseur non typé.
Solution:
Curseur typé
DECLARE
TYPE REF_PFE IS REF CURSOR
RETURN LISTE_PFE_ETUD_ENS%ROWTYPE;
PF REF_PFE;
P PF%ROWTYPE;
BEGIN

OPEN PF FOR SELECT * FROM LISTE_PFE_ETUD_ENS


WHERE NOMBRE_ETUD_PFE =3 AND NOMENS=’KLACH’ AND
PRENENS=’SOUMAYA’;

FETCH PF INTO P;
WHILE (PF%FOUND) LOOP
DBMS_OUTPUT.PUT_LINE (RPAD( P.TITREPFE,14));
FETCH PF INTO P;
END LOOP;
CLOSE PF;
DBMS_OUTPUT.PUT_LINE (‘------------------------------’) ;

OPEN PF FOR SELECT * FROM LISTE_PFE_ETUD_ENS


WHERE NOMBRE_ETUD_PFE =1 AND NOMENS=’JABEUR’ AND PRENENS=’HABIB’;

FETCH PF INTO P;
WHILE (PF%FOUND) LOOP
DBMS_OUTPUT.PUT_LINE (RPAD( P.TITREPFE,14));
FETCH PF INTO P;
END LOOP;
CLOSE PF;
END ;
/

Correction d’Examen surveillé ---- SGBD ------- MAI 2016 DSI2 3


4) Soit le bloc PL/SQL suivant :

DECLARE
CURSOR SOUT IS SELECT * FROM SOUTENANCE;
BEGIN
FOR S …………..
IF S.NOTE_PFE<10 THEN
UPDATE SOUTENANCE SET SESS=’SEPTEMBRE’
WHERE CODE_SOUT=S.CODE_SOUT;
END IF;
END LOOP;
COMMIT;
END;

Refaire ce bloc en utilisant un curseur FOR UPDATE.


Solution:
DECLARE
CURSOR SOUT IS SELECT * FROM SOUTENANCE
FOR UPDATE OF SESS NOWAIT;
BEGIN
FOR S …………..
IF S.NOTE_PFE<10 THEN
UPDATE SOUTENANCE SET SESS =’SEPTEMBRE’
WHERE CURRENT OF SOUT;
END IF;
END LOOP;
COMMIT;
END;

C/
1) Créez une fonction paramétrée intitulée NOMBRE_PFE_ENS (NUMENS) qui retourne le
nombre de projets encadrés pour un enseignant donnée.
Solution :
CREATE OR REPLACE FUNCTION NOMBRE_PFE_ENS (NUMENS
ENSEIGNANTS.CODE_ENS%TYPE) RETURN NUMBER
IS
NB_P_E NUMBER:=0 ;
BEGIN
SELECT COUNT (CODE_PFE) INTO NB_P_E
FROM PFE
WHERE CODE_ENS= NUMENS;
RETURN (NB_P_E) ;
END NOMBRE_PFE_ENS;
/

Correction d’Examen surveillé ---- SGBD ------- MAI 2016 DSI2 4


2) Créez une fonction paramétrée intitulée NOMBRE_ETU_PFE (NUMPFE) qui retourne le
nombre des étudiants d’un projet (PFE) donné.
Solution :
CREATE OR REPLACE FUNCTION NOMBRE_ETU_PFE (NUMPFE
PFE.CODE_PFE%TYPE) RETURN NUMBER
IS
NB_E_P NUMBER:=0 ;
BEGIN
SELECT COUNT (CODE_ETU) INTO NB_E_P
FROM ETUDIANTS
WHERE CODE_PFE= NUMPFE;
RETURN (NB_E_P) ;
END NOMBRE_ETU_PFE;
/

3) Créez bloc PL/SQL qui utilise deux curseurs, la boucle FOR et les fonctions
NOMBRE_PFE_ENS et NOMBRE_ETU_PFE pour mettre à jour :
- Le nombre de projets encadrés pour chaque enseignant.
- Le nombre le nombre des étudiants pour chaque projet (PFE).
Valider la modification.
Solution :
DECLARE
CURSOR ENS IS SELECT * FROM ENSEIGNANTS;

CURSOR PF IS SELECT * FROM PFE;

BEGIN
FOR E IN ENS LOOP
UPDATE ENSEIGNANTS SET NB_PFE_ENS = NOMBRE_PFE_ENS (E.CODE_ENS)
WHERE CODE_ENS=E.CODE_ENS;
END LOOP;

FOR P IN PF LOOP
UPDATE PFE SET NB_ETU_PFE= NOMBRE_ETU_PFE (P.CODE_PFE)
WHERE CODE_PFE=P.CODE_PFE;
END LOOP;

COMMIT;
END;

4) Créez un bloc PL/SQL qui utilise un curseur paramétré et la boucle FOR pour afficher la
liste des enseignants (NOM_ENS, PREN_ENS) qui ont encadré N Projets de Fin d’Etudes.
Solution :

Correction d’Examen surveillé ---- SGBD ------- MAI 2016 DSI2 5


DECLARE
CURSOR ENS (N NUMBER) IS SELECT * FROM ENSEIGNANTS WHERE
NB_PFE_ENS=N;
BEGIN

FOR E IN ENS LOOP


DBMS_OUTPUT.PUT_LINE (RPAD( E.NOM_ENS,14)||
RPAD(E.PREN_ENS,14));
END LOOP;

END;
/

5) Créez un bloc PL/SQL qui :


- Affiche la liste des enseignants (NOM_ENS, PRENOM_ENS) qui ont encadré trois
Projets de Fin d’Etudes.
- Affiche la liste des enseignants (NOM_ENS, PRENOM_ENS) qui n’ont jamais encadré
des Projets de Fin d’Etudes.
Solution :
BEGIN
AFFICHE_LISTE_ENSEIGNANTS (3);
AFFICHE_LISTE_ENSEIGNANTS (0);
END;
/

6) Créez un bloc PL/SQL, qui affiche la liste des encadreurs (NOM_ENS, PREN_ENS)
ayant des PFEs reportés.

Solution :
DECLARE
CURSOR ENS IS SELECT NOM_ENS, PREN_ENS, MENTION_SOUT
FROM ENSEIGNANTS E, PFE P, SOUTENANCE S
WHERE E.CODE_ENS=P.CODE_ENS AND P.CODE_PFE=S.CODE_PFE;
BEGIN

FOR E IN ENS LOOP


IF (E.MENTION_SOUT= ‘REPORTE’) THEN
DBMS_OUTPUT.PUT_LINE (RPAD( E.NOM_ENS,14)||RPAD(E.PREN_ENS,14));
END IF;
END LOOP;
END;
/

Correction d’Examen surveillé ---- SGBD ------- MAI 2016 DSI2 6


7) Créez une fonction paramétrée intitulée, MENTION_PFE(NUMPFE), qui retourne la
mention d’un projet (PFE) donné :
Si NOTE_PFE<10  MENTION_SOUT=’REPORTE’
Si 10≤NOTE_PFE<12  MENTION_SOUT=’PASSABLE’
Si 12≤NOTE_PFE<14  MENTION_SOUT=’ASSEZ BIEN’
Si 14≤NOTE_PFE<16  MENTION_SOUT=’BIEN’
Si 16≤NOTE_PFE<20  MENTION_SOUT=’TRES BIEN’

Solution :
CREATE OR REPLACE FUNCTION MENTION_PFE(NUMPFE PFE.CODE_PFE%TYPE)
RETURN SOUTENANCE.MENTION_SOUT%TYPE
IS
M SOUTENANCE.MENTION_SOUT%TYPE;
NOTE SOUTENANCE.NOTE_PFE%TYPE ;
BEGIN
SELECT NOTE_PFE INTO NOTE
FROM SOUTENANCE
WHERE CODE_PFE=NUMPFE;

IF NOTE <10 THEN M:=’REPORTE’;


ELSIF NOTE <12 THEN M:=’PASSABLE’ ;
ELSIF NOTE <14 THEN M:=’ASSEZ BIEN’;
ELSIF (NOTE<16) THEN M:=’BIEN’;
ELSE M :=’TRES BIEN’ ;
END IF;

RETURN (M) ;
END MENTION_PFE;
/

8) Créer une procédure non paramétrée intitulée, MISE_A_JOUR_MENTION_SESSION, qui


utilise un curseur, la boucle FOR et la fonction MENTION_PFE pour mettre à jour les
mentions et les sessions des projets PFEs :
Si MENTION_SOUT=’REPORTE’ alors
SESS  ‘SEPTEMBRE’
Solution :
CREATE OR REPLACE PROCEDURE MISE_A_JOUR_MENTION_SESSION
IS
CURSOR SOUT IS SELECT * FROM SOUTENANCE;

BEGIN
FOR S IN SOUT LOOP
UPDATE SOUTENANCE SET MENTION_SOUT = MENTION_PFE(S.CODE_PFE)
WHERE CODE_PFE=S.CODE_PFE;

Correction d’Examen surveillé ---- SGBD ------- MAI 2016 DSI2 7


IF (S.MENTION_SOUT=’REPORTE’) THEN
UPDATE SOUTENANCE SET SESS =’SEPTEMBRE’
WHERE CODE_PFE=S.CODE_PFE;
END IF ;
END LOOP;

COMMIT;
END MISE_A_JOUR_MENTION_SESSION;
/

Correction d’Examen surveillé ---- SGBD ------- MAI 2016 DSI2 8

Vous aimerez peut-être aussi