Documente Academic
Documente Profesional
Documente Cultură
Département d’informatique
3eme LMD SI Module ABD
Mars 2018
TD n° 2 : PL/SQL Oracle
Solutions
Ex01 : Blocs PL/SQL anonymes
1. Ecrire un bloc PL/SQL qui affiche l’indice i dans une boucle FOR i IN min..max LOOP .. END LOOP.
DECLARE
i number(2);
BEGIN
FOR i IN 1..5 LOOP
dbms_output.put_line('Nombre : ' || i );
END LOOP;
END;
2. Ecrire un bloc PL/SQL qui affiche le nombre total des lignes de la table EMP.
DECLARE
cpt number(3);
i number(3);
BEGIN
select count(*) into cpt from emp;
FOR i IN 1..cpt LOOP
dbms_output.put_line('Nombre : ' || i );
END LOOP;
dbms_output.put_line('Nbr. total des employés : ' || cpt );
END ;
DECLARE
nb_lignes integer;
BEGIN
DELETE FROM emp WHERE deptno = 10;
nb_lignes := SQL%ROWCOUNT;
dbms_output.put_line('Nombre de lignes supprimées : ' || nb_lignes );
ROLLBACK ;
END ;
Page : 1 S.EUSCHI
SELECT SUM(sal) INTO vtot_sal FROM emp ;
DBMS_OUTPUT.put_line(vtot_sal);
END;
2. Ecrire un bloc PL/SQL qui affiche le n° département, son nom et sa localisation en utilisant le type %ROWTYPE.
DECLARE
CURSOR c_dept IS
SELECT deptno, dname, loc FROM dept ORDER BY deptno ;
vdept c_dept%ROWTYPE ;
BEGIN
OPEN c_dept ;
DBMS_OUTPUT.put_line('N°dept' || ' Nom ' || ' Ville');
LOOP
FETCH c_dept INTO vdept ;
EXIT WHEN c_dept%NOTFOUND ;
DBMS_OUTPUT.put_line(vdept.deptno || ' ' || vdept.dname || ' '|| vdept.loc);
END LOOP ;
CLOSE c_dept ;
END;
3. Ecrire un bloc PL/SQL qui affiche le n° département, son nom et sa localisation en utilisant la boucle FOR.
set serveroutput on
DECLARE
CURSOR c_dept IS
SELECT deptno, dname, loc FROM dept ORDER BY deptno ;
BEGIN
DBMS_OUTPUT.put_line('N°dept' || ' Nom ' || ' Ville');
FOR vdept IN c_dept
LOOP
DBMS_OUTPUT.put_line(vdept.deptno || ' ' || vdept.dname || ' '|| vdept.loc);
END LOOP ;
END;
Page : 2 S.EUSCHI
Ex04: les curseurs paramétrés
Ecrire un bloc PL/SQL qui affiche les noms et les fonctions des employés des départements 10, 20 et 30 en
utilisant un curseur paramétré.
DECLARE
CURSOR cur_emp(p_dept INTEGER) IS
SELECT deptno, ename, job FROM emp WHERE deptno = p_dept;
BEGIN
dbms_output.put_line ('***Département 10***');
FOR vemp IN cur_emp(10)
LOOP
dbms_output.put_line(vemp.deptno || ' '|| vemp.ename || ' '||vemp.job);
END LOOP;
dbms_output.put_line ('***Département 20***');
FOR vemp IN cur_emp(20)
LOOP
dbms_output.put_line(vemp.deptno || ' '|| vemp.ename || ' ' ||vemp.job);
END LOOP;
dbms_output.put_line ('***Département 30***');
FOR vemp IN cur_emp(30)
LOOP
dbms_output.put_line(vemp.deptno|| ' '|| vemp.ename|| ' '|| vemp.job);
END LOOP;
END;
Page : 3 S.EUSCHI