PL/SQL (pour PROCEDURAL LANGUAGE/SQL) est un langage procédural d’Oracle corporation étendant SQL. Il permet de combiner les avantages d’un langage de programmation classique avec les possibilités de manipulation de données offertes par SQL.
Ces notes se donnent pour but de présenter succinctement PL/SQL. Il ne s’agit
en aucun cas d’un guide complet du langage.
1 Structure d’un programme PL/SQLLa structure de base d’un programme PL/SQL est celle de bloc (possiblement imbriqué). Il a généralement la forme suivante:
DECLARE/* section de déclaration */
BEGIN/* corps du bloc de programme
Il s’agit de la seule zone
dont la présence 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 procédure) ainsi que des instructions SQL.
Il s’agit de la seule partie qui soit obligatoire. Les deux autres zones, dites zone de déclaration et zone de gestion des exceptions sont facultatives. Les seuls ordres SQL que l’on peut trouver dans un bloc PL/SQL sont: SELECT, NSERT, UPDATE,DELETE.
Les autres types d’instructions (par exemple CREATE, DROP, ALTER) ne peuvent se trouver qu’à l’extérieur d’un tel bloc. Chaque instruction se termine par un “;”.
Le PL/SQL ne se soucie pas de la casse (majuscule vs. minuscule). On peut inclure des commentaires par --- (en début de chaque ligne commentée) ou par /*
.... */ (pour délimiter des blocs de commentaires).
2 Variables et typesUn nom de variable en PL/SQL comporte au plus 30 caractères. Toutes les variables ont un type On trouve trois sortes de types de variables en PL/SQL. A savoir :
• un des types utilisés en SQL pour les colonnes de tables.
• un type particulier au PL/SQL.
• un type faisant référence `a celui d’une (suite de) colonne(s) d’une table.
Les types autorisés dans PL/SQL sont nombreux. On retiendra principalement:
- Pour les types numériques : REAL, INTEGER, NUMBER (précision de 38 chiffres par défaut), NUMBER(x) (nombres avec x chiffres de précision), NUMBER(x,y) (nombres avec x chiffres de précision dont y apèes la virgule).
- Pour les types alphanumériques : CHAR(x) (chaine de caracère de longueur fixe x), VARCHAR(x) (chaine de caracère de longueur variable jusqu’à x), VARCHAR2 (identique précédent excepté que ce type supporte de plus longues chaines et que l’on est pas obligé de spécifier sa longueur maximale). PL/SQL permet aussi de manipuler des dates (type DATE) sous différents formats.
Une déclaration pourrait donc contenir les informations suivantes :
DECLARE
n NUMBER;
mot VARCHAR(20)
mot2 VARCHAR2
Une autre spécificité du PL/SQL est qu’il permet d’assigner comme type à une variable celui d’un champs d’une table (par l’opérateur %TYPE) ou d’une ligne entière (opérateur %ROWTYPE). Dans la déclaration suivante :
DECLARE
nom emp.name%TYPE;
employe emp%ROWTYPE;
la variable nom est définie comme étant du type de la colonne name de la table emp (qui doit exister au préalable). De même, employe est un vecteur du type d’une ligne de la table emp. A supposer que cette dernière ait trois champs numero, name, age de type respectifs NUMBER, VARCHAR, INTEGER, la variable employe disposera de trois composantes : employe.numero, employe.name, employe.age, de même types que ceux de la table.
Un premier petit programme (noter au passage l’instruction d’affectation ”a:=a+b”):
DECLARE
a NUMBER;
b NUMBER;
BEGIN
a:=a+b;
END;
Un deuxième petit programme (incluant une requête SQL) :
DECLARE
a NUMBER;
BEGIN
SELECT numero INTO a
FROM emp
WHERE noemp=’21’;
END;
Ce dernier exemple donne comme valeur à la variable a le résultat de la requête (qui doit être du même type). Il est impératif que la requête ne renvoie qu’un et un seul résultat (c’est à dire qu’il n’y ait qu’un seul employé numéro 21).
Autrement, une erreur se produit.
3 OpérateursPL/SQL supporte les opérateurs suivants :
• Arithmétique : +, - *, /, ** (exponentielle)
• Concaténation : ||
• Parenthèses (contrôle des priorités entre opérations): ()
• Affectation: :=
• Comparaison : =, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN
• Logique : AND, OR, NOT
4 Structures de contrôleComme n’importe quel langage procédural, PL/SQL possède un certain nombre de structures de contrôles évoluées comme les branchements conditionnels et les boucles.
4.1 Les branchements conditionnelsSyntaxe :
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 bouclesPL/SQL admet trois sortes de boucles. La première est une boucle potentiellement infinie :
LOOP
commandes;
END LOOP;
Au moins une des instructions du corps de la boucle doit être une instruction de
sortie :
EXIT WHEN <condition>;
Dès que la condition devient vraie (si elle le devient...), on sort de la boucle.
Le deuxième type de boucle permet de répéter un nombre défini de fois un même traitement :
FOR <compteur> IN [REVERSE] <limite_inf> .. <limite_sup>
commandes;
END LOOP;
Enfin, le troisième type de boucle permet la sortie selon une condition prédéfinie.
WHILE <condition> LOOP
commandes;
END LOOP;
Toutes ces structures de contrôles sont évidemment imbriquables les unes dans les autres.
Voici un même exemple traité de trois manières différentes suivant le 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 :
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;
Troisième exemple :
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;