Vous êtes sur la page 1sur 34

Bases de Données Avancées et

Distribuées

Chapitre III

SQL Procédural
M1-Ingénierie des systèmes et technologies du web

SAHMADI B. Université de Médéa 2020-2021


LOGO
SADOUKI F.
SQL Procédural

Plan de cours

Introduction

bloc d’instructions, Variables et Opérateurs

Structures de contrôle

Procédures stockées

Curseurs et Gestion des exceptions

2 2020-2021
SQL Procédural

1- Introduction

 SQL est un langage non procédural

 Le développement d’application autour d’une BDR nécessite


d’utiliser : - des variables.

- des structures de contrôle de la programmation


(boucles et alternatives).

Besoin d’un langage procédural pour lier plusieurs requêtes


SQL avec des variables et dans les structures de contrôle
habituelles.

L4G (langage de 4ième Génération) : ProceduraL SQL

3 2020-2021
SQL Procédural

1- Introduction

 ProceduraL SQL : langage de programmation procédural et


structuré pour développer des applications autour de bases de
donneés relationnelles (SQL)

 Pas de véritable standard, la plupart des SGBD relationnels


propose des langages de 4ième génération spécifiques.

- Oracle propose PL/SQL

- PostgreSQL propose PL/pgSQL très proche de PL/SQL

- MySQL et Mimer SQL proposent un langage analogue dans le principe mais plus
limité : SQL/PSM (SQL/Persistent Stored Modules)(de la norme SQL2003)

- IBM DB2 propose un dérivé de PL/SQL : SQL-PL

- Microsoft/SQL server et Sybase propose Transact-SQL (T-SQL) …

RQ: Dans ce cours on présente le langage procédural de SGBD MYSQL.


4 2020-2021
SQL Procédural

2- Bloc d’instructions, Variables et Opérateurs

Bloc d’instructions

Pour exécuter un bloc il faut l’inclure dans une procédure


cataloguée.

5 2020-2021
SQL Procédural

2- Bloc d’instructions, Variables et Opérateurs

Portée des objets


 Un objet (variable, curseur ou exception) déclaré dans un bloc est
accessible dans les sous-blocs.

 Un objet déclaré dans un sous-bloc n’est pas visible du bloc supérieur.

6 2020-2021
SQL Procédural

2- Bloc d’instructions, Variables et Opérateurs

Identificateurs
 Permet de nommer un objet utilisé dans un bloc

 Commence par une lettre (ou un chiffre)

 N’est pas limité en nombre de caractères

Exemple :

Commentaires
 Mono-lignes : commençant avec le symbole « -- » et finissant à la fin de la ligne

 Multi-lignes : commençant par « /* » et finissant par « */ »

7 2020-2021
SQL Procédural

2- Bloc d’instructions, Variables et Opérateurs

Variables
 Les variables qui sont déclarées (et éventuellement initialisées) par la
directive DECLARE.

 Deux types de variables sont disponibles sous MySQL :

- scalaires : recevant une seule valeur d’un type SQL (ex : colonne
d’une table)

- externes : définies dans la session.

Variables scalaires
Syntaxe de déclaration:

DECLARE nomVariable1[,nomVariable2...] typeMSQL [DEFAULT expression];


où DEFAULT permet d’initialiser la (ou les) variable(s).

8 2020-2021
SQL Procédural

2- Bloc d’instructions, Variables et Opérateurs

Exemples

 Dans des instructions SQL, le nom de la variable est prioritairement


interprété au détriment de la colonne de la table (de même nom)

 Donc, essayer de nommer toutes les variables différemment des


colonnes (en utilisant un préfixe, par exemple ou étiquette de bloc).

9 2020-2021
SQL Procédural

2- Bloc d’instructions, Variables et Opérateurs

Affectations

Il existe plusieurs possibilités pour affecter une valeur à une


variable :

 l’affectation comme on la connaît dans les langages de


programmation :

SET variable := expression ;

 la directive DEFAULT (voir plus haut)

 la directive INTO d’une requête (SELECT… INTO variable


FROM…)

10 2020-2021
SQL Procédural

2- Bloc d’instructions, Variables et Opérateurs

Opérateurs
 Les opérateurs SQL (logiques, arithmétiques, de concaténation…) sont

disponibles au sein d’un sous-programme.

 Les règles de priorité sont les mêmes que dans le cas de SQL.

 L’opérateur IS NULL permet de tester une formule avec la valeur NULL.

Exemples :

11 2020-2021
SQL Procédural

2- Bloc d’instructions, Variables et Opérateurs

Variables de session
 Il est possible de passer en paramètres d’entrée d’un bloc des variables
externes. Ces variables sont dites de session (user variables).

 Elles n’existent que durant la session.

 On déclare ces variables en ligne de commande à l’aide du symbole « @ ».

Exemple :

12 2020-2021
SQL Procédural

2- Bloc d’instructions, Variables et Opérateurs

Exemple de Bloc d’instructions


 Restriction MySQL : pas possible d’exécuter des blocs anonymes (sous-
programme sans nom et qui n’est pas stocké dans la base)

 Un bloc doit être inclus dans une procédure cataloguée a appelée dans
l’interface de commande
Exemple : Extraction de nombre d’heures de vol du pilote de nom 'Placide Fresnais'.

13 2020-2021
SQL Procédural

3- Structures de contrôle
En tant que langage procédural, MySQL offre la possibilité de programmer :

- Les structures conditionnelles si et cas (IF… et CASE) ;

- Des structures répétitives tant que, répéter et boucle sans fin (WHILE, REPEAT et
LOOP).

Structures conditionnelles
Deux structures pour programmer des actions conditionnées : la structure IF et la
structure CASE.

1- La structure IF

14 2020-2021
SQL Procédural

3- Structures de contrôle

1- La structure IF
Exemple :

15 2020-2021
SQL Procédural

3- Structures de contrôle

1- La structure CASE
Deux façons d’utiliser le CASE :

16 2020-2021
SQL Procédural

3- Structures de contrôle

1- La structure CASE
Exemple :

17 2020-2021
SQL Procédural

3- Structures de contrôle

Structures de contrôle répétitives


MySQL intègre les structures de contrôles WHILE, REPEAT et LOOP mais pas
le FOR.

1- Structure WHILE Exemple :

18 2020-2021
SQL Procédural

3- Structures de contrôle

Structures de contrôle répétitives


2- Structure Répéter

Exemple :

19 2020-2021
SQL Procédural

3- Structures de contrôle

Structures de contrôle répétitives


3- Structure boucle sans fin « LOOP »

Exemple :

20 2020-2021
SQL Procédural

3- Structures de contrôle

Structures de contrôle répétitives


3- Structure boucle sans fin « LOOP »
Remarques :

 La directive ITERATE force à reprendre l’exécution au début de la


boucle.

 LEAVE peut être aussi utilisé pour sortir d’un bloc (s’il est étiqueté).

 LEAVE et ITERATE peuvent aussi être employés au sein de structures


REPEAT ou WHILE.

 LOOP devient sans fin si vous n’utilisez pas l’instruction LEAVE qui passe
en séquence du END LOOP.

21 2020-2021
SQL Procédural

4- Procédures stockées

Ce sont des fonctions ou procédures « cataloguées » (stored procedures):


code applicatif entreposé et exécuté au sein du serveur de base de données.

4.1. Généralités
 Une procédure peut être appelée à l’aide :

- de l’interface de commande (par CALL),

- dans un programme externe (Java, PHP, C…),

- par d’autres procédures ou fonctions,

- dans le corps d’un déclencheur.

 Les fonctions peuvent être invoquées

- dans une instruction SQL (SELECT, INSERT, et UPDATE),

- dans une expression (affectation de variable ou calcul).

22 2020-2021
SQL Procédural

4- Procédures stockées

4.2. Les principaux avantages (stockées côté serveur) :


 La modularité et la Réutilisabilité : un sous-programme peut être
composé d’autres blocs d’instructions, et peut aussi être réutilisable, car
il peut être appelé par un autre.

 La portabilité : un sous-programme est indépendant du système


d’exploitation qui héberge le serveur MySQL. En changeant de
système, les applicatifs n’ont pas à être modifiés.

 Rapidité : La séquence des traitements contenus dans une procédure


stockée est exécutée d'un bloc, au sein même du SGBD. Par rapport à
un système classique, on fait l'économie d'un certain nombre d'aller-
retours de données entre l'application cliente et le serveur, et donc de
trafic réseau.

23 2020-2021
SQL Procédural

4- Procédures stockées

4.2. Les principaux avantages (stockées côté serveur) :


 La sécurité : car les sous-programmes s’exécutent dans un
environnement a priori sécurisé (SGBD) où il est plus facile de garder la
maîtrise sur les ordres SQL exécutés et donc sur les agissements des
utilisateurs.

 Facilité de maintenance et portabilité : Avec les procédures


stockées, une partie de la logique applicative est centralisée sur le
serveur de bases de données ; cet emplacement unique facilite la
création et la maintenance du code. De plus, toutes les applications
clientes accèdent aux procédures de manière uniforme, ce qui constitue
un niveau d'abstraction appréciable. Il en découle qu'on peut changer
de technologie client sans réécrire quoi que ce soit de cette partie du
code.
24 2020-2021
SQL Procédural

4- Procédures stockées
La syntaxe de création d’une procédure cataloguée est la suivante :

CREATE PROCEDURE [nomBase.]nomProcédure(


[ [ IN | OUT | INOUT ] param1 typeMySQL
[,[ IN | OUT | INOUT ] param2 typeMySQL ] ] ...)
[ LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES
SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'commentaire'
]
BEGIN
[DECLARE ... ;]
bloc d’instructions SQL et MySQL ... ;
END;
délimiteur
25 2020-2021
SQL Procédural

4- Procédures stockées

 Par défaut, la procédure est créée dans la base de données


courante (sélectionnée). Si un nom est spécifié (nomBase),
la procédure appartiendra à cette base de données.
 IN désigne un paramètre d’entrée (par défaut), OUT un
paramètre de sortie et INOUT un paramètre d’entrée et de
sortie.
 délimiteur : délimiteur de commandes différent de « ; »
(symbole utilisé obligatoirement en fin de chaque
déclaration et instruction du langage procédural de MySQL).
 Compilation : Pour compiler ces sous-programmes à partir
de l’interface de commande, il faut ajouter un délimiteur
après chaque dernier END comme suit :
delimiter $
Sous programme ;
$

26 2020-2021
SQL Procédural

4- Procédures stockées
La syntaxe de création d’une fonction cataloguée est la suivante :
CREATE FUNCTION [nomBase.]nomFonction(
[ param typeMySQL
[,param2 typeMySQL ] ] ...)
RETURNS typeMySQL
[ LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL
DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'commentaire'
]
BEGIN
[DECLARE ... ;]
bloc d’instructions SQL et MySQL ... ;
contenant un « RETURN variable ; »
END;
délimiteur
27 2020-2021
SQL Procédural

5. Curseurs & Exception

 Pour traiter des requêtes renvoyant plusieurs


enregistrements, il faudra utiliser des curseurs.
 Les curseurs sont très utilisés dans toute
application importante.
 Un curseur est une zone mémoire qui est générée
côté serveur (mise en cache) et qui permet de
traiter individuellement chaque ligne renvoyée par
un SELECT. Un sous-programme peut travailler
avec plusieurs curseurs en même temps.

28 2020-2021
SQL Procédural

5. Curseurs & Exception

 La figure suivante illustre la manipulation de base


d’un curseur. Le curseur est décrit après les
variables. Il est ouvert dans le code du
programme ; il s’évalue alors et va se charger en
extrayant les données de la base. Le programme
peut parcourir tout le curseur en récupérant les
lignes une par une dans une variable locale. Le
curseur est ensuite fermé.
 Les curseurs doivent être déclarés après les
variables et avant les exceptions.

29 2020-2021
SQL Procédural

5. Curseurs & Exception

 Il n’existe pour l’instant qu’une seule manière de


parcourir un curseur : du premier au dernier
enregistrement.
30 2020-2021
SQL Procédural

5. Curseurs & Exception

 S’il y-a erreur lors d’une M.A.J des données, une


exception est levée et fera s’interrompre le
programme.
 Afin d’éviter qu’un programme ne s’arrête dès la
première erreur suite à une instruction SQL
(SELECT ne retournant aucune ligne, INSERT ou
UPDATE d’une valeur incorrecte, DELETE d’un
enregistrement « père » ayant des
enregistrements « fils » associés, etc.), il est
indispensable de prévoir les cas potentiels
d’erreurs et d’associer à chacun de ces cas la
programmation d’une exception (handler dans le
vocabulaire de MySQL).

31 2020-2021
SQL Procédural

5. Curseurs & Exception

 Une exception MySQL correspond à une condition d’erreur


et peut être associée à un identificateur (exception
nommée). Une exception est détectée (aussi dite « levée »)
si elle est prévue dans un handler au cours de l’exécution
d’un bloc (entre BEGIN et END). Une fois levée, elle fait
continuer (ou sortir du bloc) le programme après avoir
réalisé une ou plusieurs instructions que le programmeur
aura explicitement spécifiées.
 La figure suivante illustre les deux mécanismes qui peuvent
être mis en œuvre pour gérer une exception (seuls
CONTINUE et EXIT sont actuellement pris en charge par
MySQL).

32 2020-2021
SQL Procédural

5. Curseurs & Exception

33 2020-2021
SQL Procédural

5. Curseurs & Exception

 Les exceptions doivent être déclarées de préférence après


les variables et avant les curseurs.

DECLARE { CONTINUE | EXIT | UNDO }


HANDLER FOR
{ SQLSTATE [VALUE] ‘valeur_sqlstate’ | nomException |
SQLWARNING
| NOT FOUND | SQLEXCEPTION | code_erreur_mysql }
instructions MySQL;
[, { SQLSTATE...} ...]
 La directive CONTINUE (appelée handler) force à poursuivre
l’exécution de programme lorsqu’il se passe un événement
prévu dans la clause FOR.
 Le handler EXIT fait sortir l’exécution du bloc courant
(entre BEGIN et END).
34 2020-2021

Vous aimerez peut-être aussi