Académique Documents
Professionnel Documents
Culture Documents
SGBD Ep 3a 1617 VF Corr
SGBD Ep 3a 1617 VF Corr
Semestre : 1 2
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 :
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)
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)
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)
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
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