Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
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
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>>]
EXCEPTION
Traitement des erreurs
[Section facultative]
Types de variables
III.2. Déclaration d’une variable
III.2.1. Variable ou constante locale de type Oracle et PL/SQL
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
);
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
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
[<<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 :