Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 6

EXAMEN

Semestre : 1 2

Session : Principale Rattrapage

Module : SGBD
Enseignants : Equipe SGBD
Classes : 3A
Documents autorisés : OUI NON Nombre de pages : 02
Date : 09-05-2017 Heure : 11h15 Durée : 01h30

Nous souhaitons créer une application qui permet de faire le suivi des projets et l’avancement
des tâches. Une partie du schéma relationnel de l’application est donnée ci-dessous :

Equipe (idEquipe, nomE)


Collaborateur (idCol, nomC, prenomC, grade, salaire, ptBonus, #idEquipe)
Projet (idProjet, titreP, dateDebP, dateFinP)
Tâche (idTâche, #idProj, dateDeb, dateFinPrévue, dateFinRéelle, #idCol)

Remarques :
- Les clés primaires sont soulignées et les clés étrangères sont précédées par un #
- Les IDs, noms, titre, et grade sont des chaines de caractères ; le salaire est un réel et le
ptBonus est un entier.
- Les équipes peuvent travailler simultanément sur un même projet
- « ptBonus » représente le total des points bonus cumulés par un collaborateur

Travail demandé :
1- Ecrire une fonction stockée FN_ETAT_TÂCHE (p_idTâche varchar, p_idProjet
varchar) qui retourne l’état d’une tâche dont l’identifiant est donné en paramètre. La
fonction doit gérer une exception lorsque les identifiants donnés n’existent pas. L’état d’une
tâche est défini comme suit : (4pts)

- « Non débutée » : date de début non renseignée


- « En cours » : date de début renseignée et date de fin réelle non renseignée
- « Finie » : date de début et date de fin réelle renseignées

Page 1 sur 6
CREATE OR REPLACE FUNCTION FN_ETAT_TACHE(idt varchar2,idp varchar2)
RETURN varchar2
IS
dd date;
df date;
BEGIN
SELECT dateDeb,dateFinRéelle INTO dd,df FROM Tache WHERE lower(idTache) =
lower(trim(idt)) AND lower(idProj)=trim(lower(idp));
CASE
WHEN dd IS NULL THEN RETURN 'Non débutée';
WHEN dd IS NOT NULL AND df IS NULL THEN RETURN 'En cours';
WHEN dd IS NOT NULL AND df IS NOT NULL THEN RETURN 'Finie';
END CASE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('La tache '||idt||' du projet '||idp||' n''existe pas');
RETURN NULL;
END;
/
BEGIN
dbms_output.put_line(FN_ETAT_TACHE('T1','P6'));
END;
/

2- Ecrire une fonction stockée FN_NB_COLL (p_idProj varchar) qui permet de retourner
le nombre d’intervenants dans un projet dont l’identifiant est donné en paramètre. Si le
projet n’existe pas, la fonction doit retourner la valeur -1. (2pts)
CREATE OR REPLACE FUNCTION FN_NB_COLL(p_idProj varchar)
RETURN INT
IS
tot INT;
BEGIN
SELECT COUNT(DISTINCT idCol) INTO tot FROM TACHE WHERE idProj=p_idProj;
IF (tot <>0) THEN
RETURN tot;
ELSE
RETURN -1;
END IF;
END;
/

3- Ecrire une vue V_DETAILS_PROJET qui permet d’afficher pour chaque projet, son titre,
sa date de début, sa date de fin ainsi que le nombre de ses intervenants en utilisant la fonction
FN_NB_COLL. (2pts)
CREATE OR REPLACE VIEW V_DETAILS_PROJET AS SELECT
titreP,dateDebP,dateFinP,FN_NB_COLL(idProjet) AS "Total" FROM Projet;

Page 2 sur 6
4- Ecrire une procédure stockée PR_TÂCHES_COLLABORATEUR qui permet de lister
pour chaque collaborateur son nom, son prénom, son grade, ses points bonus ainsi que la
liste de ses tâches. Pour chaque tâche on affiche son identifiant, sa date de début, sa date de
fin prévue ainsi que sa date de fin réelle. (3pts)

CREATE OR REPLACE PROCEDURE PR_TÂCHES_COLLABORATEUR


IS
CURSOR cur_coll IS SELECT * FROM Collaborateur;
CURSOR cur_tache(id varchar) IS SELECT * FROM Tache WHERE idCol=id;
BEGIN
FOR col IN cur_coll
LOOP
dbms_output.put_line(col.nomC||' '||col.prenomC||' '||col.grade||' '||col.ptBonus);
dbms_output.put_line('Est responsables des taches suivantes');
FOR tach IN cur_tache(col.idCol)
LOOP
dbms_output.put_line(tach.idTache||' '||tach.dateDeb||' '||tach.dateFinPrévue||'
'||tach.dateFinRéelle);
END LOOP;
END LOOP;
END;
/
5- Ecrire un trigger TRIG_PB qui permet d’augmenter de 1 les points bonus d’un
collaborateur à chaque fois que ce dernier finit une tâche avant la date prévue. Dans le cas
contraire, les points bonus sont diminués de 1. (3pts)

CREATE OR REPLACE TRIGGER TRIG_PB


AFTER UPDATE OF dateFinRéelle
ON Tache
FOR EACH ROW
DECLARE
p int;
BEGIN
IF (:new.dateFinRéelle<=:new.dateFinPrévue) THEN
p:=1;
ELSE
p:=-1;
END IF;
UPDATE Collaborateur SET ptBonus=ptBonus+p WHERE idCol=:new.idCol;
END;
/
6- Ecrire une procédure stockée PR_TÂCHE_PROJET (p_idProjet varchar) qui permet de
lister les détails des tâches des collaborateurs par rapport à un projet dont l’identifiant est

Page 3 sur 6
donné en paramètre, en utilisant la fonction FN_ETAT_TÂCHE. Le résultat de l’affichage
doit avoir le format suivant : (4pts)

La procédure doit gérer les exceptions suivantes :

a- Dans le cas où l’identifiant donné n’existe pas, afficher « le projet donné n’existe pas »,
b- Dans le cas où aucune intervention n’est enregistrée pour le projet donné, afficher « 0
interventions ».
CREATE OR REPLACE PROCEDURE PR_TÂCHE_PROJET (p_idProjet varchar)
IS
titre Projet.titreP%TYPE;
nb int:=0;
CURSOR cur_tache IS SELECT idTache, FN_ETAT_TACHE(idTache,p_idProjet) etat,
nomC||prenomC col, nomE FROM Tache t JOIN Collaborateur c ON t.idCol=c.idCol JOIN
Equipe e ON e.idEquipe=c.idEquipe WHERE t.idProj=p_idProjet;
BEGIN
SELECT titreP INTO titre FROM Projet WHERE idProjet=p_idProjet;
dbms_output.put_line('Titre du projet: '||titre);
dbms_output.put_line('------------------------');
SELECT COUNT(*) INTO nb FROM TACHE WHERE idProj=p_idProjet;
IF (nb>0) THEN // OU PLUS SIMPLEMENT : IF(FN_NB_COLL(p_idproj)>0)
dbms_output.put_line('Tache '||' - Collaborateur - '||' Equipe');
dbms_output.put_line('------------------------');
FOR t IN cur_tache LOOP
dbms_output.put_line(t.idTache||' '||t.etat||' '||t.col||' '||t.nomE);
END LOOP;
ELSE
dbms_output.put_line('0 intervention');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20002,p_idProjet||' est inexistant');
END;
/
7- Ecrire un trigger TRIG_INS_TÂCHE qui empêche toute insertion dans la table TÂCHE
dont la date de début dépasse la date de fin prévue. (2pts)
CREATE OR REPLACE TRIGGER TRIG_INS_TÂCHE
BEFORE INSERT
ON Tache
FOR EACH ROW

Page 4 sur 6
BEGIN
IF (:new.dateDeb>:new.dateFinPrévue) THEN
RAISE_APPLICATION_ERROR(-20001,'La date de début doit être inférieure à la date de
fin');
END IF;
END;
/
Proposition de correction : BON TRAVAIL

1- Création des tables :

CREATE TABLE Equipe (idEquipe varchar2(5) primary key, nomE varchar2(20))


CREATE TABLE Collaborateur (idCol varchar2(5) primary key, nomC varchar2(20),
prenomC varchar2(20), grade varchar2(20), salaire number, ptBonus int, idEquipe
varchar2(5) references Equipe(idequipe))
CREATE TABLE Projet (idProjet varchar2(5) primary key, titreP varchar2(20), dateDebP
date, dateFinP date)
CREATE TABLE Tâche (idTâche varchar2(5), idProj varchar2(5) references Projet(idProjet),
dateDeb date, dateFinPrévue date, dateFinRéelle date, idCol varchar2(5) references
Collaborateur(idCol), constraint pk_tâche primary key(idTâche,idProj))

2- Insertion de données :

BEGIN
INSERT INTO Equipe VALUES(1,'SI');
INSERT INTO Equipe VALUES(2,'Embarqué');
INSERT INTO Equipe VALUES(3,'Mobile');
INSERT INTO Equipe VALUES(4,'IT');
INSERT INTO Equipe VALUES(5,'Sécurité');
END;

BEGIN
INSERT INTO Collaborateur VALUES('C1','Flen','Ben Flen','Ingenieur',2500,0,1);
INSERT INTO Collaborateur VALUES('C2','Flena','Ben Flena','Ingenieur',2500,0,1);
INSERT INTO Collaborateur VALUES('C3','Fleni','Ben Fleni','Ingenieur',2500,0,2);
INSERT INTO Collaborateur VALUES('C4','Falten','Ben Falten','Ingenieur',2500,0,2);
INSERT INTO Collaborateur VALUES('C5','Foulena','Ben Foulen','Ingenieur',2500,0,3);
END;

BEGIN
INSERT INTO Projet VALUES('P1','Projet 1',to_date('12-12-2015','dd-mm-yy'),NULL);
INSERT INTO Projet VALUES('P2','Projet 2',to_date('01-01-2016','dd-mm-yy'),NULL);
INSERT INTO Projet VALUES('P3','Projet 3',to_date('05-05-2016','dd-mm-yy'),NULL);
INSERT INTO Projet VALUES('P4','Projet 4',to_date('03-03-2016','dd-mm-yy'),NULL);
INSERT INTO Projet VALUES('P5','Projet 5',to_date('02-02-2017','dd-mm-yy'),NULL);
END;

Page 5 sur 6
Page 6 sur 6

Vous aimerez peut-être aussi