Sie sind auf Seite 1von 23

Systèmes de Gestion de BD

Elaboré par Mme Emna HKIRI


Emna.hkiri@fsm.rnu.tn

FSM de Monastir 2020-2021


2ème année LSI

Plan du cours

 Cours 1 : Vues et Index


 Cours 2 : PL/SQL
 Cours 3: Gestion des exceptions
Cours 4: Les sous programmes
Cours 5: Les sous programmes stockés et les packages
Cours 6: Les déclencheurs
 Cours 7: Concurrence et contrôle des accès

1
Chapitre 2 : Le Langage PL/SQL

Chapitre2: Le Langage PL/SQL


1. Introduction au PL/SQL
2. Structure d’un bloc PL/SQL
3. Les Variables
4. Les constantes
5. Les types
6. Les traitements conditionnels
7. Les traitements répétitifs
8. Les transactions

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.

 Ecrire dans un éditeur et copier le contenu dans SQL+.


 Un script écrit en PL/SQL se termine obligatoirement par un /, sinon SQL+
ne l'interprète pas.

 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()

 Prennent en argument une valeur à afficher ou une variable dont la


valeur est à afficher.

 Par défaut, les fonctions d'affichage sont désactivées.

 Il convient, de les activer avec la commande SQL+


SET SERVEROUTPUT ON.

4
Les variables
 Déclaration d’une variable :
 Nom_variable type [NOT NULL] [ { :=| DEFAULT} expression ] ;

 nom variable représente le nom de la variable composé de lettres,


chiffres, $, ou # . Le nom de la variable ne peut pas excéder 30
caractères

 NOT NULL interdit d’affecter une valeur nulle dans la variable durant
toute sa vie et exige obligatoirement son initialisation à la déclaration.

 [ { :=| DEFAULT} expression ] initialise une variable dès sa


déclaration

 Exemples :
age integer;
nom varchar(30);
dateNaissance date;
Date _demain date DEFAULT SYSDATE+1;
16 ok boolean := true;

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;

 Les identificateurs de variables et de constantes doivent être


différents des noms de colonnes;

 PL/SQL n'est pas sensible à la casse. Pour lui les expressions


suivantes sont équivalentes :
 NOM_VARIABLE NUMBER ;
 Nom_Variable Number ;
 nom_variable number ;

 Commentaires
-- Pour une fin de ligne
/* Pour plusieurs
………………………..
lignes */

11

11

Déclaration d’une variable:


 Pour une meilleure lisibilité des programmes, il est recommandé de
préfixer les identificateurs selon les conventions suivantes :

12

12

6
Affectation et expressions
 L’affectation d’une expression dans une variable se fait généralement par
l’opérateur " := “

 Syntaxe Nom_variable := expression;

 Exemple:
V_Nom := ‘ALICE’;
V_Compteur := V_Compteur+1;
V_Message := V_Message || TO_CHAR (V_Salaire);

 Les variables logiques reçoivent directement TRUE, FALSE ou le résultat d’une


expression logique.
 Exemple
V_Trouve := TRUE;
V_NonTrouve:= NOT V_Trouve;
V_Admis := V_Moyenne >=10;

 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

 %TYPE : se lit de même type que


Syntaxe: nom_variable1 nom_variable2%TYPE ;

 Exemple:
 -- variable de même type que la colonne ENAME de la table EMP
V_Nom EMP.ENAME%TYPE ;

 -- variable de même type qu'une ligne de la table EMP


V_EMP EMP%ROWTYPE ;
V_Dat1 DATE ;

 -- variable de même type que V_Dat1 (DATE)


19 V_Dat2 V_Dat1%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

LES TYPES Pl/SQL


 Les types PL/SQL se répartissent en deux classes : scalaire et composé.
 Types scalaires
PL/SQL supporte les types du langage SQL (CHAR, VARCHAR2 ,
NUMBER , DATE) et offre des types supplémentaires pour déclarer
des variables et des constantes ainsi que des sous types.

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

 Un enregistrement peut être défini de deux façons, soit en définissant


ses éléments, soit en se référant à une structure de données (table de la
base ou curseur)

18

18

9
Type enregistrement (RECORD)
 La déclaration se fait en deux étapes :
a/ Déclaration du type enregistrement

Syntaxe : TYPE nom-type IS RECORD (


champ1 type1,
champ2 type2, …);
b/ Déclaration d’une variable du type enregistrement
Syntaxe
nom_variable nom_type;

 Exemple:

TYPE emp2 IS RECORD (


matr integer,
nom varchar(30));
employe emp2;
22 employe.matr := 500; )

19

19

Type enregistrement (RECORD)


 Une structure est un type regroupant plusieurs types. Une variable de
type structure contient plusieurs variables, ces variables s'appellent aussi
des champs.
 Création d'un type structure

TYPE / nomType / IS RECORD


(
/ l i s t e des champs /) ;

 On définit un type structure de la sorte :


 nomType est le nom du type structure construit avec la syntaxe
précédente.
 La liste suit la même syntaxe que la liste des colonnes d'une table dans
un CREATE TABLE.
20

20

10
Les Structures: exemple
 Par exemple, construisons le type point ,

TYPE point IS RECORD


(
abscisse NUMBER,
ordonnée NUMBER
);

 Les types servant à définir un type structure peuvent être quelconques :


 variables scalaires,
 tableaux,
 structures,
 etc.

21

21

Déclaration d'une variable de type structure


 point est maintenant un type, il devient donc possible de créer des
variables de type point, la règle est toujours la même pour déclarer des
variables en PL/SQL, par exemple:

TYPE point IS RECORD


(
abscisse NUMBER,
ordonnée NUMBER
);
P point;

 P point permet de déclarer une variable p de type point.

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.

1. Ecrivez un bloc PL/SQL pour :


a. Entrez un nom d’une ville,
b. Affichez le nombre moyen, le nombre minimum, le nombre maximum
de kilomètres des trajets qui sont partis de cette ville.

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;

b/ Déclaration de la variable du type table


Syntaxe : nom_table nom_type;
 type_scalaire : Type de données de l'attribut concerné
 NOT NULL : Ne pas insérer de valeur nulle dans un n-uplet de la table
 INDEX BY BINARY_INTEGER : Création d'un attribut contenant l'indice
du n-uplet de type obligatoire 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

 Fonctions SQL non valides en PL/SQL


Certaines fonctions SQL sont non autorisées dans les instructions
procédurales comme :
 Les fonctions de groupes , MIN, MAX, AVG, COUNT, etc. ;
 Les fonctions GREATEST et LEAST

31

31

Application
 Soit la table suivante :

 VOL(Numvol, Heure_départ, Heure_arrivée, Ville_départ, Ville_arrivée)


 Écrivez un programme PL/SQL qui insère le vol AF110 partant de tunis
à 21h40 et arrivant à Djerba à 23h10 (hypothèse : le vol n’est pas déjà
présent dans la table).

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

Les Traitements conditionnels : if


 Le IF et le CASE fonctionnent de la même façon que dans les autres

langages impératifs :
IF / condition 1 / THEN
/instructions1/

IF / condition 1 / THEN ELSIF / condition 2 /


/instructions1/ /instructions2/
ELSE
/instructions2/ ELSE
END IF ; /instructions3/

END IF ;

34

34

17
Les traitements conditionnels : case
 Les conditions sont les mêmes qu'en SQL.

 Le switch du langage C s'implémente en PL/SQL de la façon suivante :

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

Les traitements conditionnels case: exemple


 Exemple:
Declare
V_Num integer := 0 ;
Begin
Loop
V_Num := V_Num + 1 ;

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 ;

 L'instruction EXIT WHEN permet de quitter une boucle.


LOOP

/instructions/

EXIT WHEN / condition / ;

END LOOP ;
37

37

LOOP ... END LOOP


 Cette syntaxe met en place une boucle simple ou aucun e condition de
sortie n'est indiquée, il faut donc une instruction EXIT pour sortir de
ce type de boucle:
EXIT [étiquette] [ WHEN condition] ;

 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 ;

 Ainsi que la boucle WHILE :

WHILE / condition / 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;

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

La boucle FOR: Exemple


 Declare
I integer := 0 ;
Begin
For i in reverse1..3
Loop
dbms_output.put_line( to_char( i ) ) ;
End loop ;
End ;
Résultat:
3
2
1

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.

 On considère qu'un ensemble d'opérations est indivisible si une


exécution partielle de ces instructions poserait des problèmes d'intégrité
dans la base de données.

 Par exemple, dans le cas d'une base de données de gestion de comptes


en banque, un virement d'un compte à un autre se fait en deux temps :
créditer un compte d'une somme s, et débiter un autre de la même
somme s. Si une erreur survient pendant la deuxième opération, et que
la transaction est interrompue, le virement est incomplet.

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;

 Le ROLLBACK annule toutes les modifications faites depuis le début de la


transaction (donc depuis le précédent COMMIT), COMMIT les enregistre
définitivement dans la base de données.

 La variable d'environnement AUTOCOMMIT, qui peut être positionnée à ON


ou à OFF permet d'activer la gestion des transactions. Si elle est positionnée à
ON, chaque instruction a des répercussions immédiates dans la base, sinon, les
modifications ne sont effectives qu'une fois qu'un COMMIT a été exécuté.
46

46

23

Das könnte Ihnen auch gefallen