Vous êtes sur la page 1sur 12

Universit Paris XII, IUT de Fontainebleau e Dpartement dinformatique e

Introduction ` Oracle PL/SQL - Guide a


PL/SQL (pour PROCEDURAL LANGUAGE/SQL) est un langage procdural e dOracle corporation tendant SQL. Il permet de combiner les avantages dun lane gage de programmation classique avec les possibilits de manipulation de donnes e e oertes par SQL. Ces notes se donnent pour but de prsenter succintement PL/SQL. Il ne sagit e en aucun cas dun guide complet du langage.

Structure dun programme PL/SQL

La structure de base dun programme PL/SQL est celle de bloc (possiblement imbriqu). Il a gnralement la forme suivante: e e e DECLARE /* section de declaration */ BEGIN /* corps du bloc de programme Il sagit de la seule zone dont la presence est obligatoire */ EXCEPTION /* gestion des exceptions */ END; Le corps du programme (entre le BEGIN et le END) contient des instructions PL/SQL (assignements, boucles, appel de procdure) ainsi que des instructions SQL. e Il sagit de la seule partie qui soit obligatoire. Les deux autres zones, dites zone de dclaration et zone de gestion des exceptions sont facultatives. Les seuls ordres e SQL que lon peut trouver dans un bloc PL/SQL sont: SELECT, INSERT, UPDATE, DELETE. Les autres types dinstructions (par exemple CREATE, DROP, ALTER) ne 1

peuvent se trouver qu` lextrieur dun tel bloc. Chaque instruction se termine par a e un ;. Le PL/SQL ne se soucie pas de la casse (majuscule vs. minuscule). On peut inclure des commentaires par --- (en dbut de chaque ligne commente) ou par /* e e .... */ (pour dlimiter des blocs de commentaires). e

Variables et types

Un nom de variable en PL/SQL comporte au plus 30 caract`res. Toutes les variables e ont un type On trouve trois sortes de types de variables en PL/SQL. A savoir : un des types utiliss en SQL pour les colonnes de tables. e un type particulier au PL/SQL. un type faisant rfrence ` celui dune (suite de) colonne(s) dune table. ee a Les types autoriss dans PL/SQL sont nombreux. On retiendra principalement: e - Pour les types numriques : REAL, INTEGER, NUMBER (prcision de 38 chires par e e dfaut), NUMBER(x) (nombres avec x chires de prcision), NUMBER(x,y) (nombres e e avec x chires de prcision dont y apr`s la virgule). e e - Pour les types alphanumriques : CHAR(x) (chaine de carac`re de longueur xe e e x), VARCHAR(x) (chaine de carac`re de longueur variable jusqu` x), VARCHAR2 (idem e a que prcdent except que ce type supporte de plus longues chaines et que lon est e e e pas oblig de spcier sa longueur maximale). PL/SQL permet aussi de manipuler e e des dates (type DATE) sous dirents formats. e Une dclaration pourrait donc contenir les informations suivantes : e DECLARE n NUMBER; mot VARCHAR(20) mot2 VARCHAR2

Une autre spcicit du PL/SQL est quil permet dassigner comme type ` une e e a variable celui dun champs dune table (par loprateur %TYPE) ou dune ligne enti`re e e (oprateur %ROWTYPE). Dans la dclaration suivante : e e DECLARE nom emp.name%TYPE; employe emp%ROWTYPE; 2

la variable nom est dnie comme tant du type de la colonne name de la table emp e e (qui doit exister au pralable). De mme, employe est un vecteur du type dune ligne e e de la table emp. A supposer que cette derni`re ait trois champs numero, name, age e de type respectifs NUMBER, VARCHAR, INTEGER, la variable employe disposera de trois composantes : employe.numero, employe.name, employe.age, de mme types e que ceux de la table. Un premier petit progamme (noter au passage linstruction daectation a:=a+b) : DECLARE a NUMBER; b NUMBER; BEGIN a:=a+b; END; Un deuxi`me petit programme (incluant une requte SQL) : e e DECLARE a NUMBER; BEGIN SELECT numero INTO a FROM emp WHERE noemp=21; END; Ce dernier exemple donne comme valeur ` la variable a le rsultat de la requte a e e (qui doit tre du mme type). Il est impratif que la requte ne renvoie quun et un e e e e seul rsultat (cest ` dire quil ny ait quun seul employ numro 21). Autrement, e a e e une erreur se produit.

Oprateurs e

PL/SQL supporte les oprateurs suivants : e Arithmtique : +, - *, /, ** (exponentielle) e Concatnation : || e Parenth`ses (contrle des priorits entre oprations): () e o e e

Aectation: := Comparaison : =, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN Logique : AND, OR, NOT

Structures de contrle o

Comme nimporte quel langage procdural, PL/SQL possde un certain nombre de e e structures de contrles volues comme les branchements conditionnels et les boucles. o e e

4.1

Les branchements conditionels

Syntaxe : IF <condition> THEN commandes; [ ELSEIF <condition> THEN commandes; ] [ ELSE commandes; ] END IF; Un petit exemple : IF nomEmploye=TOTO THEN salaire:=salaire*2; ELSEIF salaire>10000 THEN salaire:=salaire/2; ELSE salaire:=salaire*3; END IF;

4.2

boucles

PL/SQL admet trois sortes de boucles. La premi`re est une boucle potentiellement e innie : LOOP commandes; END LOOP; Au moins une des instructions du corps de la boucle doit tre une instruction de e sortie : 4

EXIT WHEN <condition>; D`s que la condition devient vraie (si elle le devient...), on sort de la boucle. e Le deuxi`me type de boucle permet de rpter un nombre dni de fois un mme e e e e e traitement : FOR <compteur> IN [REVERSE] <limite_inf> .. <limite_sup> commandes; END LOOP; Enn, le troisi`me type de boucle permet la sortie selon une condition prdnie. e e e WHILE <condition> LOOP commandes; END LOOP; Toutes ces structures de contrles sont videmment imbriquables les unes dans o e les autres. Voici un mme exemple trait de trois mani`res direntes suivant le e e e e type de boucle choisi. DECLARE x NUMBER(3):=1; BEGIN LOOP INSERT INTO employe(noemp, nomemp, job, nodept) VALUES (x, TOTO, PROGRAMMEUR, 1); x:=x+1; EXIT WHEN x>=100 END LOOP; END; Deuxi`me exemple : e DECLARE x NUMBER(3); BEGIN FOR x IN 1..100 INSERT INTO employe(noemp, nomemp, job, nodept) VALUES (x, TOTO, PROGRAMMEUR, 1); END LOOP; END; 5

Troisi`me exemple : e DECLARE x NUMBER(3):=1; BEGIN WHILE x<=100 LOOP INSERT INTO employe(noemp, nomemp, job, nodept) VALUES (x, TOTO, PROGRAMMEUR, 1); x:=x+1; END LOOP; END;

Curseurs

Jusqu` prsent, nous avons vu comment rcuprer le rsultat de requtes SQL dans a e e e e e des variables PL/SQL lorsque ce rsultat ne comporte au plus quune seule ligne. e Bien evidemment, cette situation est loin de reprsenter le cas gnral : les requtes e e e e renvoient tr`s souvent un nombre important et non prvisible de lignes. Dans la e e plupart des langages procduraux au dessus de SQL, on introduit une notion de e curseur pour rcuprer (et exploiter) les rsultats de requtes. e e e e Un curseur est une variable dynamique qui prend pour valeur le rsultat dune e requte. La mthode pour utiliser un curseur est invariable. En premier lieu, celui-ci e e doit tre dni (dans la zone de declaration). Exemple : e e CURSOR empCur IS SELECT * FROM emp; Le curseur de nom empCur est charg dans cet exemple de rcuprer le rsultat de la e e e e requte qui suit. Il peut alors tre ouvert lorsquon souhaite lutiliser (dans le corps e e dun bloc) : OPEN empCur; Pour rcuprer les tuples successifs de la requte, on utilise linstruction : e e e FETCH empCur INTO employeVar; La premi`re fois, cest le premier tuple du rsultat de la requte qui est aect e e e e comme valeur ` la variable employeVar (qui devra tre dnie de faon adquate). a e e c e ` A chaque execution de linstruction, un nouveau tuple rsultat est charg dans e e employeVar. Enn, lorsque le traitement sur le rsultat de la requte est termin, e e e on ferme le curseur. CLOSE empCur; 6

Le petit exemple suivant slectionne lensemble des employs dont le salaire ne e e dpasse pas 6000 francs et les augmente de 500 francs. e DECLARE CURSOR SalCur IS SELECT * FROM EMP WHERE SAL<6000.00; employe EMP%ROWTYPE; BEGIN OPEN SalCur; LOOP FETCH SalCur INTO employe; UPDATE EMP SET SAL=6500.00 WHERE EMPNO=employe.empno; EXIT WHEN SalCur%NOTFOUND; END LOOP; END; Lorsquon souhaite parcourir un curseur dans une boucle pour eectuer un traitement, on peut simplier lutilisation de ceux-ci. Le programme suivant, parfaitement lgal, est quivalent au prcdent. e e e e DECLARE CURSOR SalCur IS SELECT * FROM EMP WHERE SAL<6000.00; employe EMP%ROWTYPE; BEGIN FOR employe IN SalCur LOOP UPDATE EMP SET SAL=6500.00 WHERE EMPNO=employe.empno; END LOOP; END; Dans cette boucle, louverture, la fermeture et lincrmentation du curseur SalCur e sont implicites et nont pas besoin dtre spcies. e e e Un certain nombre dinformations sur ltat dun curseur sont exploitables ` e a laide dattributs prdnis : lattribut %FOUND renvoie vrai si le dernier FETCH a e e bien ramen un tuple. Lattribut %NOTFOUND, dual du prcdent, permet de dcider e e e e si on est arriv en n de curseur. %ROWCOUNT renvoie le nombre de lignes ramens e e du curseur au moment de linterrogation. Enn %ISOPEN permet de dterminer si e le curseur est ouvert.

La gestion des exceptions

PL/SQL permet de dnir dans une zone particuli`re (de gestion dexception), e e lattitude que le programme doit avoir lorsque certaines erreurs dnies ou prdnies e e e se produisent. Un certain nombre dexceptions sont prdnies sous Oracle. Citons, pour les e e plus frquentes : NO DATA FOUND (devient vrai d`s quune requte renvoie un rsultat e e e e vide), TOO MANY ROWS (requte renvoie plus de lignes quescompt), CURSOR ALREADY OPEN e e (curseur dja ouvert), INVALID CURSOR (curseur invalide)... e Lutilisateur peut dnir ses propres exceptions. Dans ce cas, il doit dnir celles e e ci dans la zone de dclaration. Exemple : e excpt1 EXCEPTION Puis, cette exception est leve quelque part dans le programme (apr`s un test e e non concluant, par exemple), par linstruction : RAISE excpt1 Enn, dans la zone dexception un traitement est aect ` chaque exception e a possible (dnie ou prdfnie) : e e e EXCEPTION WHEN <exception1> [OR <exception2> OR ...] THEN <instructions> WHEN <exception3> [OR <exception2> OR ...] THEN <instructions> WHEN OTHERS THEN <instructions> END; Evidemment, un seul traitement dexception peut se produire avant la sortie du bloc.

Procdures et fonctions e

Il est possible de crer des procdures et des fonctions comme dans nimporte quel e e langage de programmation classique. La syntaxe de cration dune procdure est la e e suivante : CREATE OR REPLACE PROCEDURE <nom>[ (liste de parametres) ] AS <zone de declaration de varaibles> BEGIN <corps de la procedure> 8

EXCEPTION <traitement des exceptions> END;

A noter que toute fonction ou procdure cre devient un objet part enti`re de e e la base (comme une table ou une vue, par exemple). Elle est souvent appele e procdure stocke. Elle est donc, entre autres, sensible ` la notion de droit : son e e a crateur peut dcider par exemple den permettre lutilisation ` dautres utilisateurs. e a Elle est aussi appelable depuis nimporte quel bloc PL/SQL 1 . Il y a trois faon de c passer les paramtres dans une procdure : IN (lecture seule), OUT (criture seule), e e e INOUT (lecture et criture). Le mode IN est rserv au paramtres qui ne doivent e e e e pas tre modis par la procdure. Le mode OUT, pour les paramtres transmis e e e e en rsultat, le mode INOUT pour les variables dont la valeur peut tre modie en e e e sortie et consulte par la procdure (penser aux dirents passages de paramtres e e e e dans les langages de programmation classiques...). Regardons lexemple suivant : CREATE TABLE T (num1 INTEGER, num2 INTEGER) CREATE OR REPLACE PROCEDURE essai(IN x NUMBER, OUT y NUMBER, INOUT z NUMBER) AS BEGIN y:=x*z; z:=z*z; INSERT INTO T VALUES(x,z); END; Cette fonction est appele dans le bloc suivant : e DECLARE a NUMBER; b NUMBER; BEGIN a:=5; b:=10; essai(2,a,b); a:=a*b; Apr`s lappel, le couple (a, b) vaut (20, 100) et cest aussi le tuple qui est insr e ee dans T . Puis, a prend la valeur 20 100 = 2000.
sur le mme principe, on peut crer des biblioth`ques de fonctions et de procdures appeles e e e e e packages
1

Lors de lappel de la procdure, les arguments correspondants aux paramtres e e passs en mode OUT ou INOUT ne peuvent tre des constantes (puisquils doivent e e tre modiables). e Cette distinction des paramtres en fonction de lusage qui va en tre fait dans e e la procdure est tr`s pratique et facilite grandement le dbuggage. e e e On peut aussi crer des fonctions. Le principe est le mme, len-t`te devient : e e e CREATE OR REPLACE FUNCTION <nom>[(parametres)] RETURN <type du resultat> Une instruction RETURN <expression> devra se trouver dans le corps pour spcier e quel rsultat est renvoy. e e Les procdures et fonctions PL/SQL supportent assez bien la surcharge (i.e. coe existence de procdures de mme nom ayant des listes de paramtres direntes). e e e e Cest le syst`me qui, au moment de lappel, infrera, en fonction du nombre darguments e e et de leur types, quelle est la bonne procdure ` appeler. e a On peut dtruire une procdure ou une fonction par 2 : e e DROP PROCEDURE <nom de procedure>

Les dclencheurs (triggers) e

Les dclencheurs ou triggers sont des squences dactions dnis par le programe e e meur qui se dclenchent, non pas sur un appel, mais directement quand un vnement e e e particulier (spci lors de la dnition du trigger) sur une ou plusieures tables se e e e produit. Un trigger sera un objet stock (comme une table ou une procdure) La syntaxe e e est la suivante: CREATE [OR REPLACE] TRIGGER <nom> {BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON <nom de table> [FOR EACH ROW [WHEN (<condition>)]] <corps du trigger> Un trigger se dclenche avant ou apr`s (BEFORE|AFTER) une insertion, destruction e e ou mise ` jour (INSERT|DELETE|UPDATE ) sur une table (` noter que lon peut a a exprimer des conditions plus complexes avec le OR: INSERT OR DELETE ...). Loption FOR EACH ROW [WHEN (<condition>)]] fait sexecuter le trigger ` chaque a modication dune ligne de la table spcie (on dit que le trigger est de niveau e e ligne). En labsence de cette option, le trigger est execut une seule fois (niveau e table). Soit lexemple suivant :
les procdures et fonctions sont des objets stocks. On peut dont les dtruire par des instructions e e e similaires aux instructions de destructions de tables...
2

10

CREATE TABLE T1 (num1 INTEGER, num2 INTEGER); CREATE TABLE T2 (num3 INTEGER, num4 INTEGER); CREATE TRIGGER inverse AFTER INSERT ON T1 FOR EACH ROW WHEN (NEW.num1 <=3) BEGIN INSERT INTO T2 VALUES(:NEW.num2, :NEW.num1); END inverse; Ce trigger va, en cas dinsertion dun tuple dans T 1 dont la premi`re coordonne e e est infrieure ` 3, insrer le tuple inverse dans T 2. Les prexes NEW et OLD (en cas e a e de UPDATE ou de DELETE) vont permettre de faire rfrence aux valeurs des colonnes ee apr`s et avant les modications dans la table. Ils sont utiliss sous la forme NEW.num1 e e dans la condition du trigger et sous la forme :NEW.num1 dans le corps. Un trigger peut tre activ ou dsactiv par les instructions : e e e e ALTER TRIGGER <nom> {ENABLE|DISABLE}; et dtruit par : e DROP TRIGGER <nom>.

9
9.1

Quelques remarques
Achage

PL/SQL nest pas un langage avec des fonctionalits dentres sorties volues (ce e e e e nest pas son but!). Toutefois, on peut imprimer des messages et des valeurs de variables de plusieurs mani`res direntes. Le plus pratique est de faire appel ` un e e a package prdni : DBMS output. e e En premier lieu, taper au niveau de la ligne de commande : SET SERVEROUTPUT ON Pour acher, on utilise alors la commande suivante : DBMS_OUTPUT.PUT_LINE(Au revoir || nom || a bientot); Si on suppose que nom est une variable dont la valeur est toto, linstruction achera : Au revoir toto a bientot.

11

9.2

Debugger

Pour chaque objet cre (procdure, fonction, trigger...), en cas derreur de come e pilation, on peut voir ces erreurs en tapant (si essai est un nom de procdure) e : SHOW ERRORS PROCEDURE essai;

12

Vous aimerez peut-être aussi