Vous êtes sur la page 1sur 13

Cours SGBD Chapitre 3 : Les scriptes PL/SQL

Chapitre 3 : Les scriptes PL/SQL


I. Introduction
I.1. Qu’est ce que PL/SQL ?
Le langage SQL est un langage ensembliste c'est-à-dire qu'il ne manipule qu'un ensemble de
données satisfaisant des critères de recherche, aussi est un langage déclaratif non procédural.
Le PL/SQL est le langage procédural d’Oracle, il permet de traiter de manière conditionnelle les
données retournées par un ordre SQL.
PL/SQL = Procédural Language / Structured Query Language
I.2. Fonctionnalités de PL/SQL
PL/SQL comprend des instructions SQL:
La partie LID (Langage d’Interrogation des données) de SQL (Select),
La partie LMD (Langage de Manipulation des Données) de SQL (Update,
Insert,…)
La gestion des transactions (Commit, Rollback…)
Les fonctions standard de SQL
Plus une partie procédurale (IF, WHILE,…)

Le PL/SQL est une extension du langage 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.
II. Le bloc PL/SQL
II.1. La syntaxe PL/SQL

Wafa WALHA 1/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

Un programme PL/SQL est une série de déclarations, chacune composée d'une ou plusieurs
lignes de texte. Une ligne de texte est faite de combinaisons des caractères décrits ci-après :
Les lettres majuscules et minuscules : A..Z et a..z
Les chiffres entre 0..9
Les symboles suivants : ( ) + - * / < > = ! ~ ; : . @ % " ' # ^ & _ | { } ? [ ]
Dans le langage PL/SQL comme dans SQL, les majuscules sont traitées de la même manière que
les minuscules, excepté lorsqu’elles représentent la valeur d'une variable ou une constante de type
chaîne de caractères.
Le langage PL/SQL propose deux types de commentaires :
Un commentaire mono-ligne commence par deux tirets « -- » et prend fin par la fin de la
ligne.
Un commentaire multi-lignes commence par « /* » et finit par « */ ». Tous les caractères
compris entre ces deux symboles sont ignorés par le compilateur.
II.2. Structure d'un bloc PL/SQL
PL/SQL définit des blocs de commandes SQL associé à un mini-langage de programmation
impératif style Pascal.
Un bloc est composé de trois sections :
DECLARE
Déclarations des variables locales au bloc, constantes,
exceptions, curseurs
[Section facultative]
BEGIN [<<nom_bloc>>]

Commandes exécutables : Instructions PL/SQL et


SQL. Possibilités de blocs imbriqués
[Section obligatoire]

EXCEPTION
Traitement des erreurs
[Section facultative]

END ; ou [END nom_bloc ;]


Remarques :
- Chaque instruction de n'importe quelle section doit se terminer par un ';'.
- Fin de fichier PL/SQL : /
III. Les variables
Le nom d’une variable doit respecter les règles d’un identificateur qui disent :
Un identificateur doit être écrit sur 30 caractères au plus

Wafa WALHA 2/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

Un identificateur doit commence par une lettre


Un identificateur peut contenir lettres, chiffres, _, $ et #
Le nom d’une variable n’est pas sensible à la casse c'est-à-dire que les majuscules sont traitées de
la même manière que les minuscules.
Une variable doit être déclarée avant d’être utilisée.
III.1. Types de variables
Le modèle de type de PL/SQL est proche de celui de SQL, on trouve donc les types suivants :
CHAR(n)
VARCHAR2(n)
NUMBER(n[,m])
DATE
BOOLEAN (Seul le type BOOLEAN n'est pas un type SQL)
On a aussi les types composites adaptés à la récupération des colonnes et lignes des tables SQL :
relation.attribut%TYPE : définit une variable du type de l'attribut de la relation citée.
relation %ROWTYPE : définit une variable nuplet du type du n-uplet de la relation citée.
On peut également, comme en langage C, définir des constantes, des enregistrements et des
tables.

Types de variables
III.2. Déclaration d’une variable
III.2.1. Variable ou constante locale de type Oracle et PL/SQL

Wafa WALHA 3/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

Nom_Variable [CONSTANT] type [[NOT NULL] := expression] ;

Expression : peut être une constante ou un calcul faisant éventuellement référence à une variable
précédemment déclarée.
Expression peut-être :
- Une constante,
- Une variable,
- Un calcul.
Les opérateurs de calcul sont :
Les opérateurs arithmétiques :
- L’addition : +
- La soustraction : -
- La multiplication : *
- La division : / (SQL % : reste de division)
- La puissance : ** (SQL ^)
La concaténation des chaînes : ||
Parenthèses (contrôle des priorités entre opérations): ()
Comparison : =, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN
Opérateurs logique : AND, OR, NOT
Exemple :
DECLARE
Age NUMBER;
Nom VARCHAR2(30);
DateNaissance DATE;
Ok BOOLEAN:= true;
PI constant NUMBER(7,5) := 3.14159 ;
Rayon NUMBER := 1 ;
Surface NUMBER(15,5) := PI * Rayon **2 ;
Remarque :
Déclarations multiples est interdites : i, j NUMBER;
III.2.2. Variable du même type qu’une colonne d’une table
Nom_Vvariable Nom_Table.Nom_Colonne %TYPE ;

Exemple :
DECLARE

Wafa WALHA 4/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

Emp_Nom EMP.Empno%TYPE ; -- du même type que la colonne Empno


III.2.3. Variable du même type qu’une autre variable
Nom_Vvariable1 Nom_Vvariable2%TYPE ;
Exemple :
DECLARE
X NUMBER(10,3) ;
Y X%TYPE ; -- du même type que x donc de type NUMBER(10,3)
III.2.4. Variable de même type qu’une table
Nom_Variable Nom_Table %ROWTYPE;
Exemple :
DECLARE
Employe Emp%ROWTYPE; -- du même type que la table Emp
III.2.5. Variable de type enregistrement
TYPE Nom_Enregistrement IS RECORD
(
champ1 type1,
champ2 type2,
…);
Exemple :
DECLARE
TYPE ADRESSE IS RECORD
(
Numero NUMBER,
Rue VARCHAR2(35),
CodePost CHAR(5),
Ville VARCHAR2(25),
Pays VARCHAR2(30)
);
TYPE CLIENT IS RECORD
(
NumCIi NUMBER,
NomCli VARCHAR2(40),
Adrcli ADRESSE,
CA NUMBER(12,3)

Wafa WALHA 5/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

);
III.2.6. Variable de type table
TYPE Nom_Table IS TABLE of type INDEXE BY BINARY_INTEGER;
Exemple :
DECLARE
TYPE TAB IS TABLE of VARCHAR2(25) INDEXE BY BINARY_INTEGER;
Employe TAB;
III.2.7. Variable de type table multi dimension
Type Nom_Tableau IS TABLE of Nom_Table%ROWTYPE
Exemple :
DECLARE
TYPE TYP_TAB_EMP IS TABLE OF EMP%ROWTYPE ;
Tabemp TYP_TAB_EMP ;
III.3. Conversion de types
Il existe deux types de fonctions de conversion de types de données : les fonctions de conversion
explicite et les fonctions de conversion implicite.
III.3.1. Les fonctions de conversion explicite (effectuées par l'utilisateur)
Voici les trois principales fonctions de conversion explicite de types de données :
• TO_CHAR(number | date [,’format’]) : convertit un nombre ou une date en une chaîne
de caractères
• TO_NUMBER(char [‘format’]) : convertit une chaînes de caractères en un nombre
• TO_DATE(char [,’format’]) : convertit une chaîne de caractères en une date.
III.3.2. Les fonctions de conversion implicite (effectuées par le serveur Oracle)
Bien que la conversion implicite de types de données soit disponible, il est recommandé
d'effectuer des conversions de type de données explicites pour assurer la fiabilité des ordres SQL
en utilusant le serveur Oracle.
III.4. Initiation des variables
Trois possibilités de valorisation de variables sont disponibles :
Par l'opérateur d'affectation : ':=', (dans les sections DECLARE, BEGIN et
EXCEPTION)
Par la clause SELECT ... INTO ... (dans les sections BEGIN)
Par le traitement d'un curseur (dans les sections BEGIN)
III.4.1. Affectation de valeur

Wafa WALHA 6/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

Nom_Variable := Expression ;
Exemple :
BEGIN
X := 0 ;
Vnom := ‘Monsieur’ || Vnom ; -- concaténation
Y := (X+5) * Y ;
i NUMBER NOT NULL := 1000 ;
III.4.2. La clause SELECT ... INTO
SELECT {*/Liste d’expression} INTO Liste de variables FROM ... ;
Remarque :
La clause INTO est OBLIGATOIRE.
Le SELECT doit obligatoirement ramener une ligne et une seule sinon erreur.
Si le Select retourne 0 ligne : NO_DATA_FOUND, une erreur PL/SQL est générée.
Si le Select retourne plusieurs lignes : TOO_MANY_ROWS , une erreur PL/SQL est générée.
Pour traiter un ordre SELECT qui permet de ramener plusieurs lignes, on utilise un curseur.
Exercice 1:
Ecrire un programme PL/SQL qui permet d’insérer un employé dont le numéro est 44 et qui a le
même nom que l’employé numéro 7839 de la table Emp.
Solution:
DECLARE
Employe Emp%ROWTYPE;
BEGIN
SELECT * INTO Employe FROM Emp
WHERE Empno=7839;
INSERT INTO Emp(Empno,Ename) values (44,Employe.Ename);
END;
/
Exercice 2:
Ecrire un programme PL/SQL qui permet d’insérer dans la table Emp les informations
suivantes: Numéro: 1
Nom :’Ali’
Job: Enseignant
Solution:
DECLARE

Wafa WALHA 7/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

TYPE T_REC_EMP IS RECORD


(
Num Emp.Empno%TYPE,
Nom Emp.Ename%TYPE,
Job Emp.Job%TYPE
);
R_EMP T_REC_EMP ;
BEGIN
R_EMP.Num := 1 ;
R_EMP.Nom := ‘Ali ;
R_EMP.job := ‘Enseignant' ;
INSERT INTO Emp(Empno,Ename,Job) values ( R_EMP.Num, R_EMP.Nom, R_EMP.job );
END;
/
IV. Les structures de contrôles
IV.1. Les Traitements Conditionnels
Les instructions conditionnelles doivent permettre de contrôler le moment où des instructions
sont exécutées.
V.1.2. Définition et syntaxe
IF Condition THEN
Instructions ;
[Else Instructions ; ]
[ELSIF Condition THEN
Instructions ;
[Else Instructions ; ] ]
END IF;
Seules les clauses IF, THEN, END IF sont obligatoires.
La condition peut utiliser les variables définies ainsi que tous les opérateurs présents dans SQL :
=, <, >, <=, >=, <>, IS NULL, IS NOT NULL.
Else est utilisé si les instructions qui suivent ne possèdent pas de conditions.
ELSIF est utilisé si les instructions qui suivent possèdent des conditions.
Exercice :
Ecrire un programme PL/SQL qui permet d’insérer le message suivant dans la table Résultat :
‘Ali pas de travail’ si Ali n’a pas de job dans la table Emp

Wafa WALHA 8/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

‘Ali a 1000 DT de commission’ si Ali a un job de vendeur (mettre à jour la commission


dans la table Emp, commission= 1000)
‘Ali pas de commission’ si Ali a un job différent de vendeur (mettre à jour la commission
dans la table Emp, commission= 0)
Solution :
DECLARE
vjob CHAR(10);
vnom Emp.Ename%TYPE:='Ali';
message CHAR(30);
BEGIN
SELECT job INTO vjob FROM Emp
WHERE Ename=vnom;
IF vjob IS NULL
THEN message:= vnom || 'pas de travail';
ELSIF vjob='Vendeur'
THEN
UPDATE Emp
SET Comm=1000
WHERE Ename=vnom;
message:= vnom || 'a 1000 DT de commission';
ELSE
UPDATE Emp
SET comm=0
WHERE ename=vnom;
message:= vnom || 'pas de commission ';
END IF;
INSERT INTO Resultat VALUES (message);
COMMIT;
END ;
/
IV.2. Les Traitements Répétitifs
Les traitements répétitifs permettre de répéter une suite de commandes, sans en répéter les
instructions. PL/SQL nous offre la possibilité d'effectuer des traitements répétitifs grâce à trois
types d'instructions.

Wafa WALHA 9/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

IV.2.1. La boucle de base (LOOP)


LOOP permet de répéter une séquence de commandes.
Cette séquence est comprise entre le mot-clé LOOP, indiquant le début d'une boucle et END
LOOP, spécifiant sa fin.
Syntaxe :
BEGIN
[<<Label>>] LOOP
...
instructions
...
END LOOP [<<Label>>];
END ;
Les commandes EXIT, EXIT WHEN condition et GOTO permettent de sortir de la Boucle.
Exercice :
Ecrire un programme PL/SQL qui permet d’insérer les 10 premiers chiffres dans la table
Résultat.
Solution :
DECLARE
nbre NUMBER := 1 ;
BEGIN
LOOP
INSERT INTO Resultat VALUES (nbre) ;
nbre := nbre + 1
EXIT WHEN nbre > 10 ;
END LOOP ;
END ;
/
IV.2.2. La boucle FOR ... LOOP
La limitation des traitements répétitifs peut se faire en utilisant la clause FOR. Cette clause
permet également d'incrémenter une variable.
Syntaxe :

Wafa WALHA 10/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

[<<Label>>]
FOR compteur IN [REVERSE] var_debut .. var_fin LOOP
...
instructions
...
END LOOP [<<Label>>];
END ;
Compteur : est une variable de type entier, locale à la boucle. Sa valeur de départ est égale par
défaut à la valeur de l'expression entière de gauche (var_debut).
Elle s'incrémente de 1, après chaque traitement du contenu de la boucle, jusqu'à ce qu'il atteigne
la valeur de droite (var_fin).
Le mot clé REVERSE permet d'utiliser une décrémentation de 1, en prenant comme valeur
initiale celle de l'expression entière de droite et comme valeur de fin celle de l'expression entière
de gauche.
Il est possible d'arrêter la boucle avant sa fin normale par une commande EXIT conditionnelle.
Exercice :
Ecrire un programme PL/SQL qui permet de calcul de la factorielle de 9 et l’insérer dans la table
Resultat.
Solution :
DECLARE
fact NUMBER := 1 ;
i NUMBER;
BEGIN
FOR i IN 1..9
LOOP
fact := fact * i ;
END LOOP ;
INSERT INTO Resultat VALUES (fact, ‘FACTORIELLE9’);
END ;
/
IV.2.3. La boucle L'instruction WHILE ... LOOP
La clause WHILE permet d'exécuter le contenu d'une boucle tant que la condition est vérifiée.
Syntaxe :

Wafa WALHA 11/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

WHILE condition LOOP


...
instructions
...
END LOOP ;
END ;
La condition est une expression définie en combinant les opérateurs : <, >, = , !=, <=, >=;
AND, OR ...
Expression est une constante, une variable, le résultat d'une fonction.
Exercice :
Ecrire un programme PL/SQL qui permet de calcul le reste de la division de 7324 par 9 et
l’insérer dans la table Resultat.
Solution :
DECLARE
reste NUMBER := 7324 ;
BEGIN
WHILE reste >= 9
LOOP
reste := reste - 9 ;
END LOOP ;
INSERT INTO Resultat VALUES (reste,’reste division de 7324 par 9 ‘);
END;
V. Le package prédéfini " DBMS_OUPUT"
Le langage PL/SQL ne dispose d'aucune gestion intégrée des entrées/sorties. La possibilité de
gérer les sorties a toutefois été introduite, sous la forme d’un package intégrée BMS_OUTPUT.
L’application DBMS_OUTPUT 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.
DBMS_OUTPUT.PUT_LINE(‘message .....’) ;
La procédure PUT_LINE accepte comme argument, soit une expression de type chaîne de
caractères, soit une expression numérique ou une expression de type date.
SQL*Plus, possède le paramètre SERVEROUTPUT qu'il faut activer, pour connaître les
informations qui ont été écrites dans le tampon, à l'aide de la commande :

Wafa WALHA 12/13 ISET Tozeur


Cours SGBD Chapitre 3 : Les scriptes PL/SQL

SET SERVEROUTPUT ON [size taille]


Size taille : précise le nombre de caractères maximum à afficher
Remarque :
Pour ne plus autoriser l’affichage : SET SERVEROUTPUT OFF
Exercice :
Ecrire un programme PL/SQL qui permet d’afficher le nom du département 20 de la table Dep.
Solution :
DECLARE
numero Dept.Deptno%TYPE :=20;
nomdept Dept.Dname%TYPE;
BEGIN
SELECT Deptno, Dname INTO numero, nomdept
FROM Dept
WHERE Deptno = numero;
DBMS_OUTPUT.PUT_LINE('le département ' || TO_CHAR(numero) || ' a pour nom '
|| nomdept) ;
END;
/

Wafa WALHA 13/13 ISET Tozeur

Vous aimerez peut-être aussi