Beruflich Dokumente
Kultur Dokumente
Plan du cours
1
Chapitre 2 : Le Langage PL/SQL
2
1-Introduction au PL/SQL
Le PL de PL/SQL signifie Procedural Language. Il s'agit d'une extension
procédurale du SQL permettant d'effectuer des traitements complexes sur une
base de données.
Les possibilités offertes sont les mêmes qu'avec des langages impératifs
(instructions en séquence) classiques.
S'il contient des erreurs de compilation, il est possible d'afficher les messages
d'erreur avec la commande SQL+ : SHOW ERRORS.
Les Blocs
Tout code écrit dans un langage procédural est formé de blocs.
Chaque bloc comprend une section de déclaration de variables, et un
ensemble d'instructions dans lequel les variables déclarées sont visibles.
La syntaxe est
DECLARE
/ d e c l a r a t i o n de v a r i a b l e s /
BEGIN
/ i n s t r u c t i o n s a e x e cut e r /
END;
/
3
Structure d’un bloc
Un programme ou une procédure PL/SQL est un ensemble de un ou
plusieurs blocs.
Chaque bloc comporte trois sections :
1. Section déclaration --Section facultative
2. Section corps du bloc --Section obligatoire
3. Section traitement des erreurs --Section facultative
Exemple:
L’Affichage
Pour afficher le contenu d'une variable, les procédures
DBMS OUTPUT.PUT()
Et DBMS OUTPUT.PUT LINE()
4
Les variables
Déclaration d’une variable :
Nom_variable type [NOT NULL] [ { :=| DEFAULT} expression ] ;
NOT NULL interdit d’affecter une valeur nulle dans la variable durant
toute sa vie et exige obligatoirement son initialisation à la déclaration.
Les Variables
Une variable se déclare de la sorte :
nom type [ := initialisation ] ;
L'initialisation est optionnelle. On utilise les mêmes types primitifs que
dans les tables.
Les affectations se font avec la syntaxe variable := valeur ;
Par exemple :
SET SERVEROUTPUT ON
DECLARE
c varchar2 (15) := ' Hello World ! ' ;
BEGIN
DBMS_OUTPUT . PUT_LINE ( c ) ;
END;
/
10
10
5
Les variables : déclaration
Il est important de noter que :
Les déclarations multiples sont interdites (une seule déclaration
par ligne): i, j integer;
Commentaires
-- Pour une fin de ligne
/* Pour plusieurs
………………………..
lignes */
11
11
12
12
6
Affectation et expressions
L’affectation d’une expression dans une variable se fait généralement par
l’opérateur " := “
Exemple:
V_Nom := ‘ALICE’;
V_Compteur := V_Compteur+1;
V_Message := V_Message || TO_CHAR (V_Salaire);
Il est également possible d’affecter une expression à une variable avec la clause
INTO d’un curseur.
13
13
L’attribut %TYPE
référence à un type existant qui est soit une colonne d'une table soit
un type défini précédemment
Exemple:
-- variable de même type que la colonne ENAME de la table EMP
V_Nom EMP.ENAME%TYPE ;
14
14
7
Déclaration des constantes
Une constante est une variable dont l'initialisation est obligatoire et
dont la valeur ne pourra pas être modifiée en cours d'exécution
Elle est déclarée avec le mot clé : CONSTANT qui doit précéder le
type
Syntaxe:
Nom_constante CONSTANT nom_de_type [ { :=| DEFAULT}
expression ] ;
Exemple :
Pie CONSTANT NUMBER := 3. 14159 ;
15
15
16
16
8
Les Types en PL/SQL
17
17
Types composés
PL/SQL offre deux types composés :
le type enregistrement (RECORD)
et le type table (TABLE).
18
18
9
Type enregistrement (RECORD)
La déclaration se fait en deux étapes :
a/ Déclaration du type enregistrement
Exemple:
19
19
20
10
Les Structures: exemple
Par exemple, construisons le type point ,
21
21
22
22
11
Utilisation d'une variable de type structure
Pour accéder à un champ d'une variable de type structure, en lecture ou en
écriture, on utilise la notation pointée :
v.c est le champ appelé c de la variable structure appelée v. Par exemple,
DECLARE
TYPEpoint IS RECORD
( abscisse NUMBER,
ordonnée NUMBER ) ;
p point ;
BEGIN
p . abscisse := 1 ;
p . ordonnee := 3 ;
DBMS_OUTPUT . PUT_LINE ( ' abscisse = ‘ ||p .abscisse|| ' and ordonnée =' ||p . ordonnée ) ;
END;
/
23
23
Affectation
On place dans une variable le résultat d'une requête en utilisant le mot-clé INTO.
Les instructions SELECT champ_1 , . . . , champ_n INTO v_1 , . . . , v_n
FROM . . . affecte aux variables v 1, ..., v n les valeurs retournées par la requête.
Par exemple:
DECLARE
num NUMBER;
nom VARCHAR2(30) := ‘barbie' ;
BEGIN
SELECT numprod INTO num FROM PRODUIT
WHERE nomprod = nom ;
DBMS_OUTPUT . PUT_LINE ( 'L ' ' a r ticle' || nom || ' a pour numéro ' || num ) ;
END;
/
24
24
12
Application
TRAJET (NOTRAJ,VILLEDEP,VILLEARR,DATETRAJET,NBKM)
un trajet de tel numéro NOTRAJ a été effectué à telle date DATE-
TRAJET;
les villes de départ et d'arrivée sont respectivement VILLEDEP,
VILLEARR; le trajet est de tant de kilomètres NBKM.
25
25
Solution
DECLARE
nom_ville CHAR(20) ;
nombre_min INTEGER ;
nombre_max INTEGER ;
nombre_moyen INTEGER ;
BEGIN
-- Entrez un nom d'une ville
nom_ville := '&Entrez_un_nom_ville';
-- Selectionnez
SELECT AVG(nbkm), MIN(nbkm), MAX(nbkm)
INTO nombre_moyen, nombre_min, nombre_max
FROM trajet
WHERE villedep = nom_ville ;
-- Affichez
DBMS_OUTPUT.PUT_LINE('Ville départ : '|| nom_ville) ;
DBMS_OUTPUT.PUT_LINE(' - Nombre moyen : '|| TO_CHAR(nombre_moyen)) ;
DBMS_OUTPUT.PUT_LINE(' - Nombre minimum : '|| TO_CHAR(nombre_min)) ;
DBMS_OUTPUT.PUT_LINE(' - Nombre maximum : '|| TO_CHAR(nombre_max)) ;
END ;
26
26
13
Type enregistrement par référence à une table :
Type enregistrement par référence à une table :
PL/SQL permet de déclarer un enregistrement de même structure
qu’une table de la BD en utilisant le type générique %ROWTYPE :
Syntaxe:
Nom_enregistrement nom_table%ROWTYPE;
Exemple:
employe emp%ROWTYPE;
27
27
Tables et structures
Si on ne tient pas à choisir le type de chaque variable, et on tient à mettre une
valeur qui se trouve dans une colonne d'une table, il est possible de se référer
directement au type de cette colonne avec le type
nomTable.nomColonne%type.
Par exemple,
DECLARE
num PRODUIT. numprod%type ;
nom PRODUIT. nomprod%type := 'Barbie ' ;
BEGIN
SELECT numprod INTO num FROM PRODUIT
WHERE nomprod = nom ;
DBMS_OUTPUT . PUT_LINE ( 'L ' ' article ‘ ||nom || ' a pour numéro ‘ || num ) ;
END;
/
28
28
14
nomTable%rowtype.
Pour aller plus loin, il est même possible de déclarer une structure pour
représenter une ligne d'une table, le type porte alors le nom suivant :
nomTable%rowtype.
DECLARE
nom PRODUIT . nomprod%type := 'Poupée Barbie ' ;
ligne PRODUIT%rowtype ;
BEGIN
SELECT INTO ligne
FROM PRODUIT
WHERE nomprod = nom ;
DBMS_OUTPUT . PUT_LINE ( 'L ' ' a r t i c l e ' ||ligne . Nomprod|| '
a pour numero ‘|| ligne . numprod ) ;
END;
/
29
29
Type Table :
Une table PL/SQL est vecteur d’éléments d’un même type scalaire accessibles
au moyen d’un indice déclaré de type BINARY_INTEGER.
La déclaration se fait en deux étapes :
a/ Déclaration du type des éléments de la tab
Syntaxe :TYPE Nom_type IS TABLE OF type_scalaire [NOT NULL],
INDEX BY BINARY_INTEGER;
Exemple
TYPE TAB_NOTE IS TABLE OF NUMBER(5,2)
INDEX BY BINARY_INTEGER; -- déclaration d’un type
TNOTE TAB_NOTE ; -- déclaration d’une variable
30
30
15
Usage des fonctions SQL dans les instructions PL/SQL
La plupart des fonctions SQL sont utilisables dans les expressions
PL/SQL
Fonctions SQL valides en PL/SQL
31
31
Application
Soit la table suivante :
32
32
16
Solution :
DECLARE
v vol%ROWTYPE;
BEGIN
v.numvol := 'AF110';
v.heure_départ := to_date('21/11/2013 21:40', 'DD/MM/YYYY hh24:mi');
v.heure_arrivée := to_date('21/11/2013 23:10', 'DD/MM/YYYY hh24:mi');
v.ville_départ := ‘tunis';
v.ville_arrivée := ‘Djerba';
INSERT INTO vol VALUES v;
END;
33
33
langages impératifs :
IF / condition 1 / THEN
/instructions1/
END IF ;
34
34
17
Les traitements conditionnels : case
Les conditions sont les mêmes qu'en SQL.
CASE / v a r i a b l e /
WHEN / v a l e u r 1 / THEN
/instructions1/
WHEN / v a l e u r 2 / THEN
/instructions2/
...
WHEN / v a l e u r n / THEN
/instructionsn/
ELSE
/ i n s t r u c t i o n s par de f a u t /
END CASE;
35
35
CASE V_Num
WHEN 1 Then dbms_output.put_line( '1' ) ;
WHEN 2 Then dbms_output.put_line( '2' ) ;
WHEN 3 Then dbms_output.put_line( '3' ) ;
ELSE
EXIT ;
END CASE ;
End loop ;
End ;
Résultat :
1
2
3
Procédure PL/SQL terminée avec succès.
36
36
18
Les Traitements répétitifs
LOOP ... END LOOP ; permet d'implémenter les boucles
LOOP
/instructions/
END LOOP ;
/instructions/
END LOOP ;
37
37
Exemple :
Compteur := 0;
LOOP
Compteur := Compteur + 1;
Insert into LIGNE values (Compteur) ;
…
EXIT WHEN Compteur =10;
…
END LOOP;
38
38
19
Les traitements répétitifs
La boucle FOR existe aussi en PL/SQL :
FOR / v a r i a b l e / IN / i n f / . . / sup /
LOOP
/instructions/
END LOOP ;
39
39
La boucle WHILE
Cette syntaxe permet de mettre en place une boucle dont la condition de test est
évaluée au début. Si condition donne le résultat FALSE, les instructions suivantes
jusqu'au mot clé END LOOP; ne seront pas exécutées LOOP et END LOOP jouent
le rôle de FAIRE et FIN FAIRE dans une boucle algorithmique TANT QUE.
Exemple :
Declare
I integer := 0 ;
Begin
While I < 3
Loop
I := I + 1 ;
dbms_output.put_line( to_char( I) ) ;
End loop ;
End ;
Résultat :
1
2
3
40
40
20
La boucle FOR
Cette syntaxe permet de mettre en place une boucle dont le nombre
d'itérations est fixé dès l'entrée
Syntaxe :
FOR indice IN [REVERSE] b_inf..b_sup
LOOP
Séquence;
END LOOP;
Où
Indice :variable entière déclarée implicitement par la boucle
• locale
• Référencé dans la boucle seulement
• S’incrémente automatiquement de 1 à la fin de chaque itération
41
41
42
42
21
Application
Soit la table RES(NO).
Écrivez un bloc PL/SQL qui inséré les chiffres de 1 à 100 dans
cette table.
43
43
Solution
Soit la table RES(NO).
Écrivez un bloc PL/SQL qui inséré les chiffres de 1 à 100 dans
cette table.
Solution :
DECLARE
nb NUMBER := 1 ;
BEGIN
LOOP
INSERT INTO RES
VALUES(nb) ;
nb = nb + 1 ;
EXIT WHEN nb > 100 ;
END LOOP
END
44
44
22
Transactions
Un des mécanismes les plus puissants des SGBD récents réside dans le
système des transactions. Une transaction est un ensemble d'opérations
"atomiques", c'est-a-dire indivisible.
45
45
Les transactions
Il convient donc de disposer d'un mécanisme permettant de se protéger de ce
genre de désagrément. On utilise les instructions COMMIT et ROLLBACK.
Voici le squelette d'un exemple : /instructions/
IF / e r r eur / THEN
ROLLBACK;
ELSE
COMMIT;
END;
46
23