Professional Documents
Culture Documents
3 Support de cours PL/SQL F.CHAKER KHARRAT 4 Support de cours PL/SQL F.CHAKER KHARRAT
PL/SQL est un lanage au mme titre que SQL. + Une partie procdurale (IF, WHILE, )
Tout comme SQL, PL/SQL peut tre utilis au sein des outils Instructions spcifiques PL/SQL :
de la famille Oracle comme : Sql*Plus, Sql*Forms, Sql*Pro, .... Dfintion de variables
Traitements conditionnels
Traitements rptitifs
Traitement des curseurs
5 Support de cours PL/SQL F.CHAKER KHARRAT 6
Traitement des erreurs
Support de cours PL/SQL F.CHAKER KHARRAT
2. Le Bloc PL/SQL 2.1 Structure dun bloc PL/SQL
DECLARE
EXCEPTION
END ;
7 Support de cours PL/SQL F.CHAKER KHARRAT 8 Support de cours PL/SQL F.CHAKER KHARRAT
Identificateurs Oracle :
30 caractres au plus
commence par une lettre
peut contenir lettres, chiffres, _, $ et #
Pas sensible la casse
Porte habituelle des langages blocs
Doivent tre dclares avant dtre utilises
11 Support de cours PL/SQL F.CHAKER KHARRAT 12 Support de cours PL/SQL F.CHAKER KHARRAT
3.1 Types de variables 3.2 Dclaration de variables
Les variables locales se dfinissent dans la partie DECLARE dun bloc PL/SQL.
Les types habituels correspondants aux types identificateur [CONSTANT] type [:= valeur];
SQL2 ou Oracle : integer, varchar,
VARIABLES PL/SQL de type oracle :
Exemple :
Types composites adapts la rcupration des DECLARE
colonnes et lignes des tables SQL : nom CHAR(15);
Dclarations multiples interdites :
%TYPE, %ROWTYPE numero NUMBER;
date_jour DATE; i,j : integer;
salaire NUMBER(7,2);
Type rfrence : REF BEGIN
..
END;
13 Support de cours PL/SQL F.CHAKER KHARRAT 14 Support de cours PL/SQL F.CHAKER KHARRAT
Variables reprenant la mme structure quune ligne dune table : Variables de mme type quune variable prcdemment dfinie :
Syntaxe :
Syntaxe :
nom_variable table%ROWTYPE ; nom_variable2 nom_variable1%TYPE ;
Exemple :
Chaque variable de la structure Exemple :
DECLARE Enreg a le mme nom et le
mme type que la colonne associe
enreg emp%ROWTYPE ; DECLARE
BEGIN commi NUMBER(7,2) ;
.. salaire commi%TYPE ;
END;
Enreg BEGIN
..
END;
Enreg.empno Enreg.ename Enreg.deptno
17 Support de cours PL/SQL F.CHAKER KHARRAT 18 Support de cours PL/SQL F.CHAKER KHARRAT
3.3 Initialisation des variables 3.3 Initialisation des variables
Lordre SELECT
Interdire les valeurs non renseignes avec la clause NOT NULL Syntaxe :
DECLARE SELECT col1, col2 INTO var1, var2 FROM table [WHERE condition ] ;
i NUMBER NOT NULL := 1000 ;
La clause INTO est OBLIGATOIRE.
BEGIN
. Le SELECT doit obligatoirement ramener une ligne et une seule
END ; sinon erreur.
Pour traiter un ordre SELECT qui permet de ramener plusieurs lignes,
on utilise un curseur.
21 Support de cours PL/SQL F.CHAKER KHARRAT 22 Support de cours PL/SQL F.CHAKER KHARRAT
IF condition THEN
instructions; IF condition 1 THEN
4.1 Dfinition et syntaxe END IF; instructions 1;
ELSEIF condition 2 THEN
instructions 2;
4.2 Exemple ELSEIF .
IF condition THEN
instructions 1; ELSE
ELSE instructions N;
instructions 2; END IF;
END IF;
25 Support de cours PL/SQL F.CHAKER KHARRAT 26 Support de cours PL/SQL F.CHAKER KHARRAT
DECLARE
emploi CHAR(10)
nom CHAR(15) := Hammami ; 5.1 La boucle de base (LOOP)
mes CHAR(30) ;
BEGIN
SELECT job INTO emploi FROM emp WHERE ename=nom;
5.2 La boucle FOR
IF emploi IS NULL THEN mes := nom||na pas demploi;
ELSIF emploi = Commercial 5.3 La boucle WHILE
THEN UPDATE emp SET com = 1000 WHERE ename = nom;
mes := nom || commision modifie ;
ELSE UPDATE emp SET com = 0 WHERE ename = nom;
mes := nom || pas de commision ;
END IF ;
INSERT INTO resultat VALUES (mes) ;
COMMIT;
END;
27 Support de cours PL/SQL F.CHAKER KHARRAT 28 Support de cours PL/SQL F.CHAKER KHARRAT
Exemple : Insrer les 10 premiers chiffres dans la table resultat. Exemple : Calcul de factorielle 9.
DECLARE
DECLARE
fact NUMBER := 1 ;
nbre NUMBER := 1 ;
BEGIN
BEGIN
FOR i IN 1..9
LOOP
LOOP
INSERT INTO resultat VALUES (nbre) ;
fact := fact * i ;
nbre := nbre + 1
END LOOP ;
EXIT WHEN nbre > 10 ;
INSERT INTO resultat
END LOOP ;
VALUES (fact, FACTORIELLE9);
END ;
29 Support de cours PL/SQL F.CHAKER KHARRAT END ; 30 Support de cours PL/SQL F.CHAKER KHARRAT
5.3 La boucle WHILE 6. Les Curseurs
Condition est une condition dexpressions au
moyen des opratuers <, >, =, !=, AND, OR,
LIKE,
33 Support de cours PL/SQL F.CHAKER KHARRAT 34 Support de cours PL/SQL F.CHAKER KHARRAT
Pour traiter les select qui renvoient plusieurs lignes L'utilisation d'un curseur pour traiter un ordre Select
ramenant plusieurs lignes, ncessite 4 tapes :
Ils doivent tre dclars
1. Dclaration du curseur
Le code doit les utiliser explicitement avec les ordres OPEN, 2. Ouverture du curseur
FETCH et CLOSE 3. Traitement des lignes
4. Fermeture du curseur.
Le plus souvent on les utilise dans une boucle dont on sort quand
Lattribut NOTFOUND du curseur est vrai
35 Support de cours PL/SQL F.CHAKER KHARRAT 36 Support de cours PL/SQL F.CHAKER KHARRAT
6.3.1 Dclaration dun curseur explicite 6.3.1 Dclaration dun curseur explicite
Dclaration
Tout curseur explicite utilis dans un bloc PL/SQL doit tre dclar dans Exemple :
la section DECLARE du bloc en donnant :
Son nom DECLARE
Lordre select associ CURSOR dept_10 IS
Select ename,Sal FROM emp
Syntaxe WHERE deptno = 10
ORDER BY sal;
BEGIN
CURSOR nom_curseur IS ordre_select;
;
;
END;
37 Support de cours PL/SQL F.CHAKER KHARRAT 38 Support de cours PL/SQL F.CHAKER KHARRAT
6.3.2 Ouverture dun curseur explicite 6.3.2 Ouverture dun curseur explicite
Ouverture Exemple :
Aprs avoir dclar le curseur , il faut louvrir pour faire excuter
lordre SELECT.
DECLARE
Louverture du curseur se fait dans la section BEGIN du bloc
CURSOR dept_10 IS
Select ename,Sal FROM emp
Syntaxe WHERE deptno = 10
ORDER BY sal;
BEGIN
OPEN nom_curseur; ;
OPEN dept_10;
;
END;
39 Support de cours PL/SQL F.CHAKER KHARRAT 40 Support de cours PL/SQL F.CHAKER KHARRAT
Exemple :
Traitement des lignes DECLARE
Aprs lexcution du SELECT, les lignes ramenes sont traites une par CURSOR dept_10 IS
une. Select ename,sal FROM emp
WHERE deptno = 10
La valeur de chaque colonne du SELECT doit tre stocke dans une ORDER BY sal;
variable rceptrice nom emp.ename%TYPE;
salaire emp.sal%TYPE;
BEGIN
Syntaxe OPEN dept_10;
LOOP
Fetch nom_curseur INTO liste_variables; FETCH dept_10 INTO nom, salaire;
IF salaire >2500 THEN
INSERT INTO resultat
VALUES (nom,salaire);
Le Fetch ramne une seule ligne la fois. END IF;
EXIT WHEN salaire = 5000;
Pour traiter n lignes, il faut prvoir une boucle END LOOP;
41 Support de cours PL/SQL F.CHAKER KHARRAT END;
42 Support de cours PL/SQL F.CHAKER KHARRAT
6.3.4 Fermeture du curseur 6.3.4 Fermeture du curseur
Exemple :
Fermeture DECLARE
Aprs le traitement des lignes,on ferme le curseur pour librer la CURSOR dept_10 IS Select ename,sal FROM emp
place mmoire WHERE deptno = 10
ORDER BY sal;
nom emp.ename%TYPE;
Syntaxe salaire emp.sal%TYPE;
BEGIN
OPEN dept_10;
CLOSE nom_curseur; LOOP
FETCH dept_10 INTO nom, salaire;
IF salaire >2500 THEN INSERT INTO resultat VALUES (nom,salaire);
END IF;
EXIT WHEN salaire = 5000;
END LOOP;
CLOSE dept_10;
END;
43 Support de cours PL/SQL F.CHAKER KHARRAT 44 Support de cours PL/SQL F.CHAKER KHARRAT
6.4 Les attributs dun curseur 6.4 Les attributs dun curseur
Attribut %FOUND
Les attributs dun curseur (implicite ou explicite) sont des
indicateurs sur ltat dun curseur
Type: boolen
%FOUND
Syntaxe:
Dernire ligne traite
%NOTFOUND
Curseur implicite : SQL%FOUND
Curseur explicite : nom_curseur%FOUND
%ISOPEN Ouverture dun curseur
45 Support de cours PL/SQL F.CHAKER KHARRAT 46 Support de cours PL/SQL F.CHAKER KHARRAT
6.4 Les attributs dun curseur 6.4 Les attributs dun curseur
Attribut %FOUND (Exemple) Attribut %NOTFOUND
DECLARE
CURSOR dept_10 IS Select ename,sal FROM emp
WHERE deptno = 10 ORDER BY sal;
Type: boolen
nom emp.ename%TYPE; Syntaxe:
salaire emp.sal%TYPE;
BEGIN Curseur implicite : SQL%NOTFOUND
OPEN dept_10; Curseur explicite : nom_curseur%NOTFOUND
FETCH dept_10 INTO nom, salaire;
WHILE dept_10%FOUND
LOOP Si sa valeur est vrai donc le dernier FETCH na pas
IF salaire >2500 THEN
INSERT INTO resultat VALUES (nom,salaire); ramen une ligne
END IF;
FETCH dept_10 INTO nom, salaire;
END LOOP;
CLOSE dept_10;
END; Support de cours PL/SQL F.CHAKER KHARRAT Support de cours PL/SQL F.CHAKER KHARRAT
47 48
6.4 Les attributs dun curseur 6.4 Les attributs dun curseur
Attribut %NOTFOUND (Exemple) Attribut %ISOPEN
6.4 Les attributs dun curseur 6.4 Les attributs dun curseur
Attribut %ISOPEN (Exemple) Attribut %ROWCOUNT
DECLARE
CURSOR dept_10 IS Type: numrique
Select ename,sal FROM emp WHERE deptno = 10 ORDER BY sal;
nom emp.ename%TYPE; Syntaxe:
salaire emp.sal%TYPE;
BEGIN Curseur explicite : nom_curseur%ROWCOUNT.
IF NOT (dept_10%ISOPEN) THEN OPEN dept_10;
END IF;
Traduit la nime ligne ramene par le FETCH
LOOP
FETCH dept_10 INTO nom, salaire;
EXIT WHEN DEPT_10%NOTFOUND;
IF salaire >2500 THEN
INSERT INTO resultat VALUES (nom,salaire);
END IF;
END LOOP;
CLOSE dept_10;
END;
51 Support de cours PL/SQL F.CHAKER KHARRAT 52 Support de cours PL/SQL F.CHAKER KHARRAT
6.4 Les attributs dun curseur 6.4 Les attributs dun curseur
DECLARE
Cet attribut permet la dclaration implicite d'une structure dont les lments
CURSOR dept_10 IS sont d'un type identique aux colonnes ramenes par le curseur.
Select ename,sal FROM emp WHERE deptno = 10 ORDER BY sal;
nom emp.ename%TYPE; Syntaxe :
salaire emp.sal%TYPE;
BEGIN Dans la partie dclarative du bloc.
OPEN dept_10; CURSOR nomcurseur IS ordre_select;
LOOP
FETCH dept_10 INTO nom, salaire; nomrecord nomcurseur%Rowtype;
EXIT WHEN DEPT_10%NOTFOUND OR DEPT_10%ROWCOUNT>15 ;
IF salaire >2500 THEN INSERT INTO resultat VALUES (nom,salaire);
END IF;
Les lments de la structure sont identifis par :
END LOOP; nomrecord.nomcolonne
CLOSE dept_10;
END;
La structure est renseigne par le Fetch :
FETCH nomcurseur INTO nomrecord;
53 Support de cours PL/SQL F.CHAKER KHARRAT 54 Support de cours PL/SQL F.CHAKER KHARRAT
6.4 Les attributs dun curseur 6.5 Boucle FOR pour un curseur
Attribut %ROWTYPE (Exemple)
Elle simplifie la programmation car elle vite dutiliser explicitement les
DECLARE
instructions OPEN, FETCH et CLOSE
CURSOR c1 IS Select ename,sal+NVL(comm,0) saltot FROM emp
WHERE deptno = 10 ORDER BY sal; Elle dclare implicitement une variable de type row associe au
c1_rec c1%ROWTYPE;
BEGIN curseur.
OPEN c1;
LOOP
DECLARE
FETCH c1 INTO c1_rec;
CURSOR nom_curseur IS ordre_select;
EXIT WHEN c1%NOTFOUND
IF c1_rec.saltot >2500 THEN INSERT INTO resultat BEGIN
VALUES (c1_rec.ename, c1_rec.saltot); FOR nom_rec IN nom_curseur LOOP
END IF; /*--------------Traitements----------------*/
END LOOP; END LOOP;
CLOSE c1; END;
END;
55 Support de cours PL/SQL F.CHAKER KHARRAT 56 Support de cours PL/SQL F.CHAKER KHARRAT
57 Support de cours PL/SQL F.CHAKER KHARRAT 58 Support de cours PL/SQL F.CHAKER KHARRAT
Le mcanisme de gestion d'erreurs dans PL/SQL est appel On distingue 2 types d'erreurs ou d'exceptions :
gestionnaire des exceptions. Erreur interne : dans ce cas la main est rendue directement au
Il permet au dveloppeur de planifier sa gestion et systme environnant.
d'abandonner ou de continuer le traitement en prsence
Anomalie dtermine par l'utilisateur.
d'une erreur.
Il faut affecter un traitement appropri aux erreurs apparues La solution :
dans un bloc PL/SQL. Donner un nom l'erreur (si elle n'est pas dj prdfinie),
Dfinir les anomalies utilisateurs, leur associer un nom,
Dfinir le traitement effectuer.
59 Support de cours PL/SQL F.CHAKER KHARRAT 60 Support de cours PL/SQL F.CHAKER KHARRAT
7.2 Les exceptions internes 7.2 Les exceptions internes
Une erreur interne est produite quand un bloc PL/SQL viole Les exceptions fournies par Oracle sont regroupes dans ce tableau :
une rgle d'Oracle ou dpasse une limite dpendant du systme
d'exploitation.
Les erreurs Oracle gnres par le noyau sont numrotes, or le
gestionnaire des exceptions de PL/SQL, ne sait que grer des
erreurs nommes.
Pour cela PL/SQL a redfini quelques erreurs Oracle comme
des exceptions. Ainsi, pour grer d'autres erreurs Oracle,
l'utilisateur doit utiliser le gestionnaire OTHERS ou
EXCEPTION_INIT pour nommer ces erreurs.
61 Support de cours PL/SQL F.CHAKER KHARRAT 62 Support de cours PL/SQL F.CHAKER KHARRAT
Exemple :
DECLARE
salaire numeric(8,2);
salaire_trop_bas EXCEPTION;
BEGIN
SELECT sal INTO salaire FROM emp WHERE matr=50;
IF salaire < 300 THEN RAISE salaire_trop_bas;
END IF;
- - suite du bloc
EXCEPTION
WHEN salaire_trop_bas THEN ;
dbms_output.put_line(message);
END; Permet laffichage dun message
sur cran
65 Support de cours PL/SQL F.CHAKER KHARRAT