Vous êtes sur la page 1sur 6

NOM : PRENOM : GROUPE

EMSI CASA
3IIR, SQL PL/SQL
2020-2021
Examen
DUREE : 2H00 DOCUMENTS DU COURS ET TP AUTORISES AU FORMAT PAPIER

PRESENTATION NOTEE SUR 2 POINTS

L’ENONCE EST CLAIR ET PRECIS. DONC, AUCUNE QUESTION NE SERA PRISE.


DANS LE CAS DE DOUTE, POSEZ VOS HYPOTHESES ET REPONDEZ.

VOUS POUVEZ DETACHER LA 1 ERE PAGE

ENONCE
On considère le schéma suivant de la base de données : BDExamens.

Fig. 1 : schéma logique de la BD

Les clés primaires sont soulignées et les flèches indiquent une contrainte d’intégrité
référentielle.
La sémantique de chaque table et attribut est donnée dans le tableau suivant :

Fig. 2 : dictionnaire de données

1/6
EMSI CASA-3IIR-SQL PLSQL-EXAMEN FINAL LE 11/02/2021
NOM : PRENOM : GROUPE

PARTIE 1 : LANGAGE DE DEFINITION DE DONNEES


1.1. On suppose que les tables COURS et ETUDIANT sont déjà créées. Créez la table
EXAMENS. (2 points)

-- contraintes :
-- (NumCours, NumEtd) primary key
-- NumEtd qui fait référence à NumEtd dans la table Etudiant
-- NumCours qui fait référence à NumCous dans la table Cours
-- NoteExam obligatoire et comprise entre 0 et 20

create table EXAMENS (


NumCours number (7) ,
NumEtd number (7) ,
NoteExam number (4,2) ,
CONSTRAINT PK_EXAMS PRIMARY KEY (NumCours , NumEtd ),
CONSTRAINT CNNV_NOTE_EXAM CHECK (NoteExam IS NOT NULL AND NoteExam
BETWEEN 0 AND 20),
CONSTRAINT FK_EXAM_COURS FOREIGN KEY (NumCours) REFERENCES
COURS(NumCours),
CONSTRAINT FK_EXAM_ETD FOREIGN KEY (NumEtd) REFERENCES
ETUDIANT(NumEtd)
);

PARTIE 2 : REQUETES SQL


2.1. Ecrivez une requête qui retourne la note de l’étudiant numéro 117 obtenue dans l’examen
du cours nommé 'SQL PLSQL'. Le schéma de la réponse est (NoteExam) (1 point).
… select NoteExam
from examens ex, cours co
where co.NomCOurs='SQL PLSQL' AND ex.NumEtd=117 AND
ex.NumCours=Co.NumCours;
-- ou
Select NoteExam
from examens ex JOIN cours co ON ex.NumCours=Co.NumCours
where co.NomCOurs='SQL PLSQL' AND ex.NumEtd=117;
…………………………………………………………………………………………………...
…………………………………………………………………………………………………...
…………………………………………………………………………………………………...

2/6
EMSI CASA-3IIR-SQL PLSQL-EXAMEN FINAL LE 11/02/2021
NOM : PRENOM : GROUPE
2.2. Ecrivez une requête qui retourne les notes de l’étudiant numéro 117 obtenues dans tous
les examens qu’il a passés. Le schéma de la réponse est (NumCours, NomCours, NoteExam)
(1 point).
……… select co.NumCours, co.NomCours, ex.NoteExam
from examens ex , cours co
where ex.NumEtd=117 AND ex.NumCours=Co.NumCours;
-- ou
Select NoteExam
from examens ex JOIN cours co ON ex.NumCours=Co.NumCours
where ex.NumEtd=117;
…………………………………………………………………………………………...

2.3. Ecrivez une requête qui retourne la moyenne de tous les étudiants. La moyenne d’un
étudiant est la somme de ses notes obtenues, dans les examens de ses cours, divisée par le
nombre des notes. Le résultat doit être ordonné par la classe et le nom d’étudiant. Schéma de
la réponse (NumEtd, NomEtd, Classe, Moyenne). (2 points).

…… -- version 1 (on compte uniquement les examens passés)

select et.NumEtd, et.NomEtd, et.Classe, AVG(ex.NoteExam) Moyenne


from examens ex, etudiant et
where ex.Numetd=et.NumEtd
GROUP BY et.NumEtd, et.NomEtd, et.Classe;

-- version 2 (on calcule pour tous les cours et si l'étudiant n'a pas une note dans un cours
-- on comptabilise 0)
Select et.NumEtd, et.NomEtd, et.Classe,
NVL(SUM(ex.NoteExam),0)/COUNT(co.NumCours) Moyenne
from etudiant et LEFT JOIN examens ex ON et.NumEtd=ex.NumEtd
RIGHT JOIN Cours co ON ex.NumCours=co.NumCours
GROUP BY et.NumEtd, et.NomEtd, et.Classe
ORDER BY NVL(SUM(ex.NoteExam),0)/COUNT(co.NumCours);
……………………………………………………………………………………………...
…………………………………………………………………………………………………...

3/6
EMSI CASA-3IIR-SQL PLSQL-EXAMEN FINAL LE 11/02/2021
NOM : PRENOM : GROUPE
2.4. Ecrivez une requête qui retourne tous les étudiants de la classe 5 qui ont une moyenne
inférieure à 10 (<10) ordonnés par le nom et le prénom des étudiants. Schéma de la réponse
(NumEtd, NomEtd, Moyenne). (1.5 points)
…………… select et.NumEtd, et.NomEtd, et.Classe,
NVL(SUM(ex.NoteExam),0)/COUNT(co.NumCours) Moyenne
from etudiant et LEFT JOIN examens ex ON et.NumEtd=ex.NumEtd
RIGHT JOIN Cours co ON ex.NumCours=co.NumCours
where et.classe=5
GROUP BY et.NumEtd, et.NomEtd, et.Classe
HAVING NVL(SUM(ex.NoteExam),0)/COUNT(co.NumCours)<10
ORDER BY NVL(SUM(ex.NoteExam),0)/COUNT(co.NumCours);
……………………………………………………………………………………...
2.5. Ecrivez une requête qui retourne le major de la classe 5. Le major de la classe est
l’étudiant, ou les étudiants, qui a la plus grande moyenne. Schéma de la réponse (NumEtd,
NomEtd, Moyenne). (1.5 points)
…………………………………………………………………………………………………...
PARTIE 3 : FONCTIONS ET PROCEDURES
On veut calculer les moyennes des étudiants d’une classe et les stocker dans la table
TabMoysClasse donnée par :
NumLign le numéro de ligne donné par la séquence SeqTabMoys
NumClasse le numéro de la classe de l’étudiant
NumEtd le numéro de l’étudiant
Moy la moyenne de l’étudiant
DtCalcul la date du clacul. La date d’aujourd’hui.

On suppose que la table TabMoysClasse déjà créée.

3.1. Créez la séquence SeqTabMoys (1 point).


create sequence SeqTabMoys;
…………………………………………………………………………………………………...

3.2. Créez la procédure MoyenneDeClasse (p_Classe IN number), avec p_Classe le numéro


de la classe, qui calcule la moyenne de tous les élèves de la classe p_Classe et les stocke dans
la table TabMoysClasse. (4 points).
…………………………………………………………………………………………………...
-- requete
Select et.NumEtd, et.NomEtd, NVL(SUM(ex.NoteExam),0)/COUNT(co.NumCours)
Moyenne
from etudiant et LEFT JOIN examens ex ON et.NumEtd=ex.NumEtd
RIGHT JOIN Cours co ON ex.NumCours=co.NumCours

4/6
EMSI CASA-3IIR-SQL PLSQL-EXAMEN FINAL LE 11/02/2021
NOM : PRENOM : GROUPE
WHERE co.Classe=p_Classe
GROUP BY et.NumEtd, et.NomEtd, et.Classe
ORDER BY NVL (SUM (ex.NoteExam),0)/COUNT(co.NumCours);
create or replace procedure MoyenneDeClasse (p_Classe IN number)
IS
CURSOR ListeMoysEts(ArgClasse IN number) IS
select et.NumEtd, et.NomEtd, NVL(SUM(ex.NoteExam),0)/COUNT(co.NumCours)
Moyenne
from etudiant et LEFT JOIN examens ex ON et.NumEtd=ex.NumEtd
RIGHT JOIN Cours co ON ex.NumCours=co.NumCours
WHERE co.Classe=ArgClasse
GROUP BY et.NumEtd, et.NomEtd, et.Classe
ORDER BY NVL (SUM (ex.NoteExam),0)/COUNT(co.NumCours);
BEGIN
FOR LigneMoy IN ListeMoysEts(p_Classe) LOOP
INSERT INTO TabMoysClasse values (
SeqTabMoys.NEXTVAL,
p_Classe,
LigneMoy.NumEtd,
LigneMoy.Moyenne,
sysdate
);
END LOOP;
END MoyenneDeClasse;
/
PARTIE 4 : TRIGGER
On veut tracer les modifications des notes dans la table EXAMENS et stocker les
modifications dans la table TrModifNoteExamens donnée par : NumLign le numéro de ligne
donné par la séquence SeqTabTr
NumClasse le numéro de la classe de l’étudiant
NumEtd le numéro de l’étudiant
NumCours le nuémro de cours dont la note de l’examen a été modifiée
OldNote l’ancienne note autrement la note avant mdification
NewNote la nouvelle valeur de la note après modification
Oper l’opérateur qui a procédé à la modification (il est donné par USER) DtModif la
date de la modification. La date d’aujourd’hui.

5/6
EMSI CASA-3IIR-SQL PLSQL-EXAMEN FINAL LE 11/02/2021
NOM : PRENOM : GROUPE
On suppose que la table TrModifNoteExamens et la séquence SeqTabTr sont déjà créées.

4.1. Ecrivez le trigger qui permet de faire ce traçage. (4 points)

…………………………………………………………………………………………………...
create or replace trigger CheckModifsNotesExamens
AFTER UPDATE OF NoteExa
ON EXAMENS
FOR EACH ROW
DECLARE
vclasse etudiant.classe%type;
BEGIN
select classe into vclasse
from etudiant
where numetd=: NEW.NumEtd;

INSERT INTO TrModifNoteExamens VALUES (


SeqTabTr.NEXTVAL,
vclasse,
:OLD.NumEtd,
: Old.NumCours,
:OLD.NoteExam,
:NEW.NoteExam,
USER,
sysdate
);
END ;
/

6/6
EMSI CASA-3IIR-SQL PLSQL-EXAMEN FINAL LE 11/02/2021

Vous aimerez peut-être aussi