Vous êtes sur la page 1sur 4

Solution exercice 1:

EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO#)

DEPT (DEPTNO, DNAME, LOC)

1.DECLARE
v_DNAME DEPT. DNAME %TYPE;
v_LOC DEPT. LOC %TYPE ;
v_nombre integer ;
BEGIN
SELECT DNAME, LOC
INTO v_DNAME, v_LOC
FROM DEPT
WHERE DEPTNO = 2 ;
SELECT count(*) INTO v_nombre
FROM EMP
WHERE DEPTNO = 2 ;
dbms_output.put_line('le département 2 s'appelle’||' ' || v_DNAME ||' ' || ‘Est localisé à’||' ' ||
v_LOC||' ' || ‘et contient ||' ' || v_nombre||' ' || ‘ employés’);
END;
2. Ecrire un programme PL/SQL qui affiche le nom et la fonction de l’employé ayant le
salaire max.

DECLARE
v_ENAME EMP.ENAME%TYPE ;
BEGIN
SELECT ENAME
INTO v_ENAME
FROM EMP
WHERE SAL = Select max(SAL) from EMP;
dbms_output.put_line(v_ENAME);
END;
3. Est-ce que le programme va fonctionner s’il y a plusieurs employés ayant un salaire max ?

Le programme ne va pas fonctionner dans ce cas et un message d’erreur va etre généré. Il faut
prévoir un curseur explicite pour se cas de problème.

SGBD 1
4. Créer une nouvelle table vide EMP_FR de même structure que EMP. On pourra, par soucis
de rapidité, recopier la table EMP dans EMP_FR pour en obtenir la structure, puis effacer tous
les tuples de EMP_FR.
CREATE TABLE EMP_FR AS SELECT *
FROM EMP ;
Delete from EMP_FR;
5. Écrire un programme PL/SQL permettant de recopier tous les tuples de la table EMP dans
la table en augmentant au passage leur salaire de 15 % les opérations nécessaires sur le salaire
et la commission.
DECLARE
Cursor c_emp is select * from emp;
v_Struct c_emp %ROWTYPE;
v_sal EMP.sal%TYPE
BEGIN
OPEN c_job;
LOOP
FETCH c_emp into v_struct;
EXIT WHEN c_emp %NOTFOUND;
v_sal := c_emp.sal *1.15;
Insert into EMP_FR values (v_struct. EMPNO, v_struct .ENAME, v_struct.JOB,
v_struct .MGR, v_struct.HIREDATE, v_sal, v_struct.COMM, v_struct.DEPTNO);
END LOOP;
END; /

SGBD 2
Exercice 2
On désire pouvoir consulter à tout instant les effectifs des différents blocs de TD en Licence
d’Informatique. Il s’agit de définir un programme PL/SQL permettant l’insertion automatique
de tuples dans une relation (table) EFFECTIF_PAR_BLOC. Cette information est
implicitement contenue dans la relation ETUDIANT.

EDUDIANT (numero_etudiant, nom_etudiant, numero_bloc)

EFFECTIF_PAR_ BLOC (numero_bloc, effectif_bloc)

On vous demande de définir un bloc PL/SQL intégrant les requêtes SQL nécessaires et
permettant d’insérer dans la relation EFFECTIF_PAR_BLOC les tuples constitués du numéro
de bloc et de son effectif calculé. Dans le bloc PL/SQL vous devez :

a. Déclarer un curseur explicite dont la requête fournie le nombre d’étudiants par BLOC.
Pour cela vous devez faire un groupement par BLOC et utiliser la fonction COUNT ( )
pour compter le nombre d’étudiants par BLOC.
b. Ouvrir et parcourir le curseur ligne par ligne par l’intermédiaire d’une boucle.
c. Insérer chaque ligne du curseur dans la table EFFECTIF_PAR_BLOC.

Exercice 2 :
declare
cursor insertion is
select numero_bloc, count(*)
from etudiant
group by numero_bloc;
numbloc number;
effectif number;
BEGIN
open insertion;
loop
fetch insertion into numbloc, effectif;
EXIT WHEN insertion%NOTFOUND ; --sortie boucle

SGBD 3
insert into effectif_par_bloc values(numbloc, effectif);
END LOOP;
end;
/

SGBD 4

Vous aimerez peut-être aussi