Académique Documents
Professionnel Documents
Culture Documents
: Langage PL/SQL
Chapitre 4
Langage PL/SQL
3. Utilisation de PL/SQL
- PL/SQL peut être utilisé pour l’écriture des procédures stockées et des triggers
- Il convient aussi pour écrire des fonctions utilisateurs qui peuvent être utilisées dans les
requêtes SQL (en plus des fonctions prédéfinies)
- Il est aussi utilisé dans des outils Oracle, Forms et Report en particulier
4. Présentation PL/SQL
Le langage PL/SQL (Procedural Language extension to SQL) étend SQL en lui ajoutant des
éléments, tels que :
- les variables et les types
- les structures de contrôle et les boucles
- les procédures et les fonctions
- les types d’objets et les méthodes.
Les programmes PL/SQL peuvent être appelés à partir des environnements de développements
Oracle suivants :
- SQL*Plus,
- Oracle Enterprise Manager,
- Les précompilateurs Oracle (tels que Pro*C, Pro*COBOL, etc),
- Oracle Call Interface (OCI)
- Server Manager,
- Java Virtual Machine (JVM)
Les programmes PL/SQL sont écrits sous forme de blocs de code définissant plusieurs sections
comme la déclaration de variables, le code exécutable et la gestion d’exceptions (erreurs). Le code
PL/SQL peut être stocké dans la base sous forme d’un sous-programme doté d’un nom ou il peut
être codé directement dans SQL*Plus en tant que « bloc de code anonyme» (sans nom). Lorsqu’il
est stocké dans la base, le sous-programme inclut une section entête dans laquelle il est nommé,
mais qui contient également la déclaration de son type et la définition d’arguments optionnels.
[DECLARE]
....
BEGIN
....
[EXCEPTION]
.....
END ;
DECLARE :
la section DECLARE contient la définition et l’initialisation des structures et des variables
utilisées dans le bloc. Elle est facultative si le programme n’a aucune variable.
BEGIN
la section corps du bloc contient les instructions du programme et la section de traitement des
erreurs. Cette section est obligatoire et elle se termine par le mot clé END.
EXCEPTION
La section EXCEPTION contient l’instruction de gestion des erreurs. Elle sert facultative.
Lorsque on spécifie le mot-clé DECLARE ou BEGIN, SQL*Plus détecte qu’il s’agit d’un bloc
PL/SQL et non d’une instruction SQL. IL doit cependant savoir quand se termine le bloc. La barre
oblique « / », raccourci de la commande SQL*Plus RUN, lui en fournit l’indication.
Instruction NULL précise qu’aucune action ne doit être entreprise et que l’exécution du
programme se poursuit normalement.
Exemple :
SQL> begin
2 DELETE DETAILS_COMMANDES WHERE NO_COMMANDES <11070 ;
3 INSERT INTO CATEGORIES VALUES (9, ‘Cosmétiques’, ‘Produits beautés’);
4 COMMIT;
5 end;
6 /
PL/SQL procedure successfully completed.
Attention :
Le corps du bloc peut contenir les instructions SQL de type Langage de Manipulation de Données,
mais il ne peut comporter aucune instruction du Langage de Définition de Données.
Le mot clé PRAGMA signifie que le reste de l’ordre PL/SQL est une directive de compilation.
EXCEPTION_INIT : indique au compilateur que l’on souhaite associer une exception
déclarée dans un programme à un code d’erreur spécifique.
Exemple :
SQL> DELETE DETAILS_COMMANDES WHERE NO_COMMANDES < 11070 ;
40 ligne (s) supprimée (s)
SQL> declare
2 pragma autonomous_transaction;
3 begin
4 INSERT INTO CATEGORIES VALUES (9,’Cosmétiques’, ‘Produits beautés’);
5 COMMIT;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL>ROLLBACK;
Rollback complete
SQL>
SQL> SELECT COUNT (*) FROM DETAILS_COMMANDES WHERE NO_COMMANDES >11070;
COUNT (*)
.......
40
Le PL/SQL permet d’imbriquer ou d’encapsuler des blocs anonymes dans d’autres blocs PL/SQL.
On peut également imbriquer des blocs anonymes dans d’autres blocs anonymes à plusieurs
niveaux.
La possibilité de gérer les sorties est introduite sous forme d’une application intégrée (paquetage :
regroupement de procédures et de fonctions) DBMS_OUTPUT; elle permet d’envoyer des messages
depuis un bloc PL/SQL. La procédure PUT_LINE de cette application permet de placer des
informations dans un tampon qui pourra être lu par un autre bloc PL/SQL.
Syntaxe :
Nom_variable [CONSTANT] TYPE [NOT NULL] [{DEFAULT | :=} VALEUR] ;
Nom_variable : 30 caractères au plus, commence par une lettre, peut contenir lettres, chiffres, _, $
et #, et doit être unique dans le bloc.Une variable doit être déclarée avant être utilisée.
TYPE
- un des types scalaires (types de SQL2 et décrits dans la table 1)
- un type composite adapté à la récupération des colonnes et lignes des tables SQL (%TYPE,
%ROWTYPE)
- type référence : REF
- grands objets : un type de données qui spécifient la localisation des grands objets.
CONSTANT la variable est une constante sa valeur ne change plus dans le bloc.
Types Numériques Types dates
BINARY_INTEGER Date
DEC INTERVAL DAY TO SECOND
DECIMAL INTERVAL YEAR TO MOUNTH
DOUBLE PRECISION TIMESTAMP
FLOAT TIMESTAMP WITH TIME ZONE
INT TIMESTAMP WITH LOCAL TIME ZONES
INTEGER
NATURAL Types caractères Types ROW
NATURALN CHAR ROW
NUMBER CHARACTER LONG ROW
NUMERIC LONG
PLS_INTEGER NCHAR Types ROWID
POSITIVE NVARCHAR2
POSITIVEN STRING ROWID
REAL VARCHAR UROWID
SIGNTYPE VARCHAR2
SMALLINT Types booléens
BOOLEAN
NOM DATE_EMBAUCHE
DULUC 01/01/16
Déclaration %ROWTYPE
On peut déclarer qu’une variable composée qui est équivalente à une ligne dans la table spécifiée
Syntaxe :
Nom_variable {Nom_table | Nom_variable} %ROWTYPE ;
Exemple 1 : Exemple 2 :
SQL> declare SQL> declare
1 client CLIENTS%ROWTYPE ; 1 v Employes%ROWTYPE;
2 Begin 2 begin
3 client.CODE_CLIENT := ‘ETELI’ 3 select * INTO v
4 client.SOCIETE := ‘ETELIA’; 4 from employes
5 client.ADRESSE := ’44, Paul Claudel’ ;
5 where NO_Employes = 5;
6 client.VILLE := ‘Strasbourg’ ;
7 client.CODE_POSTAL:= ‘67000’ ; 6 dbms_ouput.put_line (v.Nom||’ ‘|| v.Prenom) ;
8 dbms_ouput.put_line(client.CODE_CLIENT ||’ ‘|| 7 end;
8 client.SOCIETE ||’ ‘|| 8 /
9 client.ADRESSE ||’ ‘|| Buchanan Steven
10 client.VILLE ||’ ‘|| Procédure PL/SQL terminée avec succès
11 client.CODE_POSTAL) ;
12
13 end;
14 /
ETELI ETELIA 44, Paul Claudel Stasbourg 67000
Procédure PL/SQL terminée avec succès
4. Commentaires
-- Pour une fin de ligne
/* Pour plusieurs lignes */
5. Structures de contrôle
Structures conditionnelles
IF condition IF condition1 CASE expression
THEN THEN WHEN expr1 THEN instructions1;
instructions; instructions1; [WHEN expr2 THEN instructions2;
END IF; ELSIF …]
condition2 [ELSE instructionsN;]
THEN END;
IF condition instructions2;
THEN ELSIF … expression peut avoir n’importe quel
instructions1; … type simple (ne peut pas par exemple
ELSE ELSE être un RECORD)
instructions2; instructionsN;
END IF; END IF;
Structures itératives :
6. Curseurs
Lorsque l’on exécute un ordre SQL à partir de PL/SQL, Oracle alloue une zone de travail privée
pour cet ordre. Cette zone de travail contient des informations relatives à l’ordre SQL ainsi que les
statuts d’exécution de l’ordre. Les curseurs PL/SQL sont un mécanisme permettant de nommer
cette zone de travail et de manipuler les données qu’elle contient.
Le curseur peut être implicite (pas déclaré par l’utilisateur) ou explicite. Les curseurs explicites
servent à retourner plusieurs lignes avec un select.
Un programme PL/SQL ouvre un curseur, traite les enregistrements retournés par l’ordre SQL,
puis ferme le curseur. Le curseur permet d’isoler l’enregistrement courant d’un jeu de résultats.
Les étapes de la vie d’un curseur d’un curseur explicite, pour traiter un ordre SELECT, sont les
suivants :
- déclaration du curseur
- ouverture du curseur
- traitement des lignes
- fermeture du curseur.
Les types d’arguments sont les suivants : CHAR, NUMBER, DATE, BOOLEAN ; leur longueur
n’est pas spécifiée. Le passage des valeurs des paramètres s’effectue à l’ouverture du curseur.
Ouverture d’un curseur
Dès que vous ouvrez le curseur, l’exécution de l’ordre SQL est lancée. Cette phase d’ouverture
s’effectue dans la section BEGIN du bloc.
Syntaxe
OPEN Nom_curseur
[(Valeur_ARGUMENT[,…])] ;
Pour chaque exécution d’un ordre de manipulation du curseur, le noyau renvoie une information
appelée statut, qui indique si l’ordre a été exécuté avec succès ou non. Cette information est
disponible dans le programme par l’intermédiaire de quatre attributs rattachés à chaque curseur.
Les statuts du curseur explicite sont :
%ROWCOUNT : nombre de lignes traitées par le curseur
%FOUND : vrai si au moins une ligne a été traitée par la requête ou le dernier fetch
%NOTFOUND : vrai si aucune ligne n’a été traitée par la requête ou le dernier fetch
%ISOPEN : vrai si le curseur est ouvert (utile seulement pour les curseurs explicites)
7. Exceptions
Le langage PL/SQL gère les erreurs du programme comme des exceptions, des situations qui ne
devraient pas se produire.
On distingue les classes d’exceptions suivantes :
- les erreurs système Oracle
- les erreurs induites par une action de l’utilisateur
- les avertissements d l’application à l’utilisateur.
Saisir une exception
Une exception ne provoque pas nécessairement l’arrêt du programme si elle est saisie par un bloc
(dans la partie« EXCEPTION »)
Une exception non saisie remonte dans la procédure appelante (où elle peut être saisie)
Exceptions prédéfinies
NO_DATA_FOUND
TOO_MANY_ROWS
VALUE_ERROR (erreur arithmétique)
ZERO_DIVIDE ....
Traitement des exceptions
BEGIN
…
EXCEPTION
WHEN NO_DATA_FOUND THEN
...
WHEN TOO_MANY_ROWS THEN
...
WHEN OTHERS THEN -- optionnel
...
END;
Exceptions utilisateur
Elles doivent être déclarées avec le type EXCEPTION. On les lève avec l’instruction
RAISE
8. Procédures et fonctions
Création d’une procédure Création d’une fonction
Pour les fonctions, seul le passage par valeur (IN) est autorisé
Les fonctions peuvent aussi être utilisées dans les requêtes SQL