Académique Documents
Professionnel Documents
Culture Documents
******
******
ليSECTION : DSI2
ÉPREUVE : SGBD
CORRECTION D’EXAMEN SURVEILLÉ
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 (‘------------------------------’) ;
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 ;
/
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;
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;
/
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;
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 :
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
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;
RETURN (M) ;
END MENTION_PFE;
/
BEGIN
FOR S IN SOUT LOOP
UPDATE SOUTENANCE SET MENTION_SOUT = MENTION_PFE(S.CODE_PFE)
WHERE CODE_PFE=S.CODE_PFE;
COMMIT;
END MISE_A_JOUR_MENTION_SESSION;
/