Vous êtes sur la page 1sur 7

Soit le schéma relationnel suivant :

EMP (Matr, NomE, Poste, DateEmb, Sup#, Salaire, Comm, NumDept#)

DEPT (NumDept, NomDept, Lieu, directeur#)

PROJET (CodeP, NomP)

PARTICIPATION (Matr#, CodeP#, Fonction)

Répondez aux questions suivantes :

1. Définir un bloc PL/SQL anonyme, en prévoyant les exceptions que vous jugez nécessaire,

permettant de lire les détails des projets effectués par tous les employés, le résultat est trié

selon la matricule employé.

Réponse :

Set serveroutput on ;

DECLARE

Cursor C_emp is select P.Matr, P.CodeP, Pr.NomP from Participation P, Projet Pr

Where P.CodeP = Pr.CodeP order by P.Matr;

E_emp Exception;

rec C_emp%rowtype;

BEGIN

Open C_emp;

DBMS_output.put_line(RPAD('Matr.Emp.',15) || RPAD('Code Projet',15) || RPAD('Nom

Projet',15));

loop

Fetch C_emp into rec;

exit when C_emp%notFound;

DBMS_output.put_line(RPAD(rec.Matr,15) || RPAD(rec.CodeP,15) ||

RPAD(rec.NomP,15));

end loop;

if(C_emp%rowcount = 0) then

raise E_emp;

end if;

close C_emp;

EXCEPTION
when E_emp then

DBMS_output.put_line('Aucun Projet trouvé...');

--when others then

--DBMS_output.put_line('Exception non reconnue...');

END;

2. Définir un bloc PL/SQL anonyme, en prévoyant les exceptions que vous jugez nécessaire,

permettant de lire les détails de tous les employés ainsi que le nombre de projets effectués

par chacun d’eux.

a. En utilisant deux curseurs explicites.

Réponse :

Set serveroutput on ;

DECLARE

Cursor C_emp is select E.Matr, E.NomE, E.Poste, E.NumDept from EMP E order

by E.Matr;

Cursor C_NBProjets(P_Matr EMP.MATR%type) is select count(P.CodeP) from

Participation P, EMP E

Where P.Matr = E.Matr and E.Matr = P_Matr group by P.Matr;

E_emp Exception;

rec C_emp%rowtype;

nbPr Number :=0;

BEGIN

Open C_emp;

DBMS_output.put_line(RPAD('Matr Emp',15) || RPAD('Nom EMP',15) ||

RPAD('Poste EMP',15) || RPAD('Dept EMP',15) || RPAD('nb Projets',15));

loop

Fetch C_emp into rec;

exit when C_emp%notFound;

Open C_NBProjets(rec.Matr);

nbPr:=0;

Fetch C_NBProjets into nbPr;


DBMS_output.put_line(RPAD(rec.Matr,15) || RPAD(rec.NomE,15) ||

RPAD(rec.Poste,15) || RPAD(rec.NumDept,15) || RPAD(nbPr,15));

close C_NBProjets;

end loop;

if(C_emp%rowcount = 0) then

raise E_emp;

end if;

close C_emp;

EXCEPTION

when E_emp then

DBMS_output.put_line('Aucun Employé trouvé...');

--when others then

--DBMS_output.put_line('Exception non reconnue...');

END;

b. En utilisant un curseur explicite et un curseur implicite.

Réponse :

Set serveroutput on ;

DECLARE

Cursor C_emp is select E.Matr, E.NomE, E.Poste, E.NumDept from EMP E order

by E.Matr;

E_emp Exception;

rec C_emp%rowtype;

nbPr Number :=0;

BEGIN

Open C_emp;

DBMS_output.put_line(RPAD('Matr Emp',15) || RPAD('Nom EMP',15) ||

RPAD('Poste EMP',15) || RPAD('Dept EMP',15) || RPAD('nb Projets',15));

loop

Fetch C_emp into rec;

exit when C_emp%notFound;


nbPr:=0;

begin

select count(P.CodeP) into nbPr from Participation P

Where P.Matr = rec.Matr group by P.Matr;

exception

when no_data_found then

nbPr:=0;

end;

DBMS_output.put_line(RPAD(rec.Matr,15) || RPAD(rec.NomE,15) ||

RPAD(rec.Poste,15) || RPAD(rec.NumDept,15) || RPAD(nbPr,15));

end loop;

if(C_emp%rowcount = 0) then

raise E_emp;

end if;

close C_emp;

EXCEPTION

when E_emp then

DBMS_output.put_line('Aucun Employé trouvé...');

when too_many_rows then

DBMS_output.put_line('Commande Select retourne plusieurs lignes...');

3. Soit une fonction max_sal_dept(p_deptno emp.deptno%TYPE) qui retourne le salaire

le plus élevé des employés d'un département donné dont le numéro est fourni comme

paramètre :

a. Ecrire cette fonction sous forme d’une fonction non stockée dans un bloc

anonyme.

Réponse :

Set serveroutput on ;

DECLARE

SalaireMax Number :=0;

function max_sal_dept(p_deptno in emp.numdept%TYPE) return Number is

Cursor C_salaire is select max(salaire) from EMP where numdept = p_deptno;


E_salaire Exception;

MaxSal Number :=0;

BEGIN

Open C_salaire;

Fetch C_salaire into MaxSal;

if(C_salaire%rowcount = 0) then

raise E_salaire;

end if;

close C_salaire;

return MaxSal;

EXCEPTION

when E_salaire then

DBMS_output.put_line('Aucun Employé trouvé...');

return NULL;

END;

BEGIN

SalaireMax:= max_sal_dept(10);

DBMS_output.put_line(RPAD('Le Salaire Maximal est : ',30) || SalaireMax);

END;

b. Ecrire cette fonction sous forme d’une fonction stockée.

Réponse :

Create or replace function max_sal_dept(p_deptno in emp.numdept%TYPE)

return Number is

Cursor C_salaire is select max(salaire) from EMP where numdept = p_deptno;

E_salaire Exception;

MaxSal Number :=0;

BEGIN

Open C_salaire;

Fetch C_salaire into MaxSal;

if(C_salaire%rowcount = 0) then
raise E_salaire;

end if;

close C_salaire;

return MaxSal;

EXCEPTION

when E_salaire then

DBMS_output.put_line('Aucun Employé trouvé...');

return NULL;

END max_sal_dept;

c. Appeler cette fonction dans les deux cas. Quelle est la différence entre les deux

cas?

Réponse :

La fonction non stockée est définie est appelée dans le même bloc anonyme (ou autre

bloc nommé), alors elle n’est pas visible ailleurs. Cependant, la fonction stockée est

définie d’une manière indépendante, c’est un bloc nommé indépendant. Elle est

appelée dans un autre bloc nommé/anonyme. Voilà un exemple :

Set serveroutput on ;

DECLARE

SalaireMax Number :=0;

BEGIN

SalaireMax:= max_sal_dept(10);

DBMS_output.put_line(RPAD('Le Salaire Maximal est : ',30) || SalaireMax);

END;

4. Dans un bloc PL/SQL anonyme, déclarer et tester une procédure « ListeProjets1 » qui

affiche la liste des projets effectués par tous les employés.

Réponse :

Set serveroutput on ;

DECLARE
procedure ListeProjets1 is

Cursor C_Projets is select distinct P.CodeP, NomP from Participation P, Projet Pr

where P.CodeP = Pr.CodeP order by P.CodeP;

E_Projets Exception;

rec C_Projets%rowtype;

BEGIN

Open C_Projets;

DBMS_output.put_line(RPAD('Code Projet',20) || RPAD('Nom Projet',20));

Loop

Fetch C_Projets into rec;

exit when C_Projets%notfound;

DBMS_output.put_line(RPAD(rec.Codep,20) || RPAD(rec.NomP,20));

end Loop;

if(C_Projets%rowcount = 0) then

raise E_Projets;

end if;

close C_Projets;

EXCEPTION

when E_Projets then

DBMS_output.put_line('Aucun Projet trouvé...');

END;

BEGIN

-- appel de la procédure :

ListeProjets1;

END;

Vous aimerez peut-être aussi