Vous êtes sur la page 1sur 9

Chapitre 4 

: Langage PL/SQL

Chapitre 4

Langage PL/SQL

-1- Nacéra Madani


Chapitre 4 : Langage PL/SQL

1. Pourquoi PL/ SQL (langage propriétaire de Oracle)


- SQL est un langage non procédural
- Les traitements complexes sont parfois difficiles à écrire si on ne peut utiliser des variables
et les structures de programmation comme les boucles et les alternatives.
- On ressent vite le besoin d’un langage procédural pour lier plusieurs requêtes SQL avec des
variables et dans les structures de programmation habituelles.

2. Principales caractéristiques de PL/SQL


- Extension de SQL : des requêtes SQL cohabitent avec les structures de contrôle habituelles
de la programmation structurée (blocs, alternatives, boucles)
- La syntaxe ressemble au langage Ada
- Un programme est constitué de procédures et de fonctions
- Des variables permettent l’échange d’information entre les requêtes SQL et le reste du
programme

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.

4.1. Syntaxe d’un bloc PL/SQL

-2- Nacéra Madani


Chapitre 4 : Langage PL/SQL

[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.

AUTONOMOUS_TRANSACTION : indique au compilateur que le bloc s’exécute


dans une transaction indépendante, une instruction COMMIT ou ROLLBACK exécutée
dans le bloc n’impacte pas les autres transactions.

Exemple :
SQL> DELETE DETAILS_COMMANDES WHERE NO_COMMANDES < 11070 ;
40 ligne (s) supprimée (s)

SQL> declare

-3- Nacéra Madani


Chapitre 4 : Langage PL/SQL

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.

4.2. Sortie à l’écran :


Le langage PL/SQL ne dispose d’aucune gestion intégrée des entrées/sorties. Il s’agit en fait d’un
choix de conception, car l’affichage des valeurs de variables ou de structures de données n’est pas
une fonction utile à la manipulation des données stockées dans la base.

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.

Oracle Entreprise Manager et SQL*Plus possèdent le paramètre SERVEROUTPUT qu’il faut


activer à l’aide de la commande SET SERVEROUTPUT ON pour connaître les informations qui
ont été écrites dans le tampon après l’exécution d’une commande INSERT, UPDATE, DELETE,
d’une fonction, d’une procédure ou d’un bloc PL/SQL anonyme.
Exemple :
SQL> SET SERVEROUPUT ON ;
SQL> begin
2 dbms_output.put_line (‘Bonjour utilisateur ‘ ||user||
3 ’ aujourd’’hui est le ‘ ||
4 to_char(sysdate,’dd mm yyyy’));
5 dbms_output.put_line ( uid) ;
6 dbms_output.put_line ( user) ;
7 dbms_output.put_line ( sysdate) ;
8 end;
9 /
Bonjour utilisateur Fabrication aujourd’hui est le 31 12 2015
60
Fabrication
31/12/15
PL/SQL procedure successfully completed
4.3. Déclaration de variables 

-4- Nacéra Madani


Chapitre 4 : Langage 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

Table 1 : Types de données scalaires


Déclaration %TYPE
On peut déclarer qu’une variable est du même type qu’une colonne d’une table ou d’une vue (ou
qu’une autre variable) :
Syntaxe :
Nom_variable {Nom_table.colonne | Nom_variable} %TYPE ;
Exemple :
SQL> declare
1 date_embauche Employes.Date_embauche%TYPE
2 := ADD_MONTHS(TRUNC(SYSDATE,’MONTH’),1) ;
3 Begin
4 Insert into Employes Values
5 (10, ‘DULUC’,’Vincentin’,’Chef des ventes’,
6 ‘M’, ‘01/02/1968’,date_embauche,10000, 0) ;
7 dbms_ouput.put_line ( date_embauche) ;
8 end;
9 /
01/01/16
PL/SQL procedure successfully completed
SQL> SELECT NOM, DATE_EMBAUCHE FROM EMPLOYES WHERE NO_EMPLOYES= 10 ;

-5- Nacéra Madani


Chapitre 4 : Langage PL/SQL

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- Nacéra Madani


Chapitre 4 : Langage PL/SQL

Boucle « tant que » Boucle générale Boucle « pour »


[<<Nom_Boucle>>] [<<Nom_boucle>>] [<<Nom_boucle>>]
WHILE condition LOOP LOOP FOR compteur IN [REVERSE] exp1..exp2 LOOP
instructions; instructions; instructions;
END LOOP [Nom_boucle]; EXIT [WHEN condition]; END LOOP [Nom_boucle];
END LOOP [Nom_boucle];

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.

Déclaration d’un curseur 


Syntaxe
CURSOR Nom_curseur
[(Nom_Argument TYPE := Valeur_DEFAUT[,…])]
IS REQUETE ;

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[,…])] ;

Traitement des lignes d’un curseur :


L’ordre OPEN a forcé l’exécution de l’ordre SQL associé au curseur. Il faut maintenant récupérer
les lignes de l’ordre SELECT et les traiter une par une, en stockant la valeur de chaque colonne de
l’ordre SQL dans une variable réceptrice.
La commande FETCH ne retourne qu’un enregistrement. Elle transfère les valeurs projetées par
l’ordre SELECT dans un enregistrement ou dans une liste de variables.
Syntaxe
FETCH Nom_curseur INTO {Nom_enregistrement | Nom_variable [,…]} ;
Statut d’un curseur :

-7- Nacéra Madani


Chapitre 4 : Langage PL/SQL

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)

La syntaxe de consultation d’un attribut est


Nom_curseur%ATTRIBUT ;

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

-8- Nacéra Madani


Chapitre 4 : Langage PL/SQL

create [or replace] create [or replace]


PROCEDURE Nom_Procedure [(<liste params>) ] FUNCTION Nom_Fonction
{ IS | AS } [(<liste params>)]
-- déclaration des variables RETURN <type_retour> { IS | AS }
BEGIN -- déclaration des variables
-- code de la procédure BEGIN
END [Nom_Procedue]; code de la procédure
Return EXPRESSION ;
EXCEPTION …..
END [Nom_Fonction];

Passage des paramètres


Dans la définition d’une procédure on indique le type de passage que l’on veut pour les paramètres:
IN pour le passage par valeur
IN OUT pour le passage par référence
OUT pour le passage par référence mais pour un paramètre dont la valeur n’est pas utilisée
en entrée

Pour les fonctions, seul le passage par valeur (IN) est autorisé

Les fonctions peuvent aussi être utilisées dans les requêtes SQL

-9- Nacéra Madani

Vous aimerez peut-être aussi