Académique Documents
Professionnel Documents
Culture Documents
PL-SQL
MySQL – Procédures et fonctions stockées
SOMMAIRE
SOMMAIRE 1
Présentation
Usages
Les SGBD-R en général, et MySQL en particulier, permettent d’écrire des procédures de
programmation impérative classique (type Pascal, C, VB, PHP, etc.) qui seront enregistrées dans
la base de données.
Ces procédures ont plusieurs usages :
Approche objet
Ces procédures (et fonctions) permettent de développer des méthodes d’utilisation de la BD,
méthode qui cachent un accès direct aux données. Elles jouent alors le rôle des méthodes dans
les classes de la programmation objet.
Les procédures vont encapsuler les attributs et permettre certains usages particuliers.
Administration et archivage
Les procédures stockées peuvent aussi servir pour gérer des tâches d’archivage récurrentes et
pour des tâches d’administration des utilisateurs et/ou des données.
Script d’exemple
use empdept;
drop procedure if exists insertemp; delimiter //
Explications
• La procédure est créée avec l’instruction : « create procedure » Une liste de variable est
passée en paramètre.
• Des commentaires sont ajoutés avec le « comment »
• Le corps de la procédure commence par « begin » et finit par « end ; »
• Dans le corps de la procédure on peut mettre des requêtes SQL et utiliser les paramètres de
la procédure.
• Avant la création, il faut changer de délimiteur : delimiter //. Ceci vient du fait que la
procédure utilise des « ; » comme délimiteur, et que le « ; » est le délimiteur standard du
SQL.
• On termine la procédure par un délimiteur : //
• Après le //, il faut revenir au délimiteur standard : delimiter ;
Principe
... begin
select * from emp; end ;
//
delimiter ;
Commentaires
/* script de définition d’une procédure
procédure « bonjour » : affiche bonjour,
usage des commentaires en style C
*/
DECLARE: déclaration
DECLARE my_int int;
SET : affectation
SET my_int=20;
Exemple
drop procedure if exists testVariables; delimiter //
create procedure testVariables ( ) begin
declare my_int int; declare my_bigint
bigint; declare my_num numeric(8,2);
declare my_pi float default 3.1415926;
declare my_text text;
declare my_date date default ‘2008-02-01’;
declare my_varchar varchar(30) default ‘bonjour’;
set my_int=20;
set my_bigint = power(my_int,3);
select my_varchar, my_int, my_bigint, my_pi, my_date, my_num,
my_text;
end;
//
delimiter ;
Exemple
select ‘bonjour’ into @x ; select
@x;
set @y=’hello’;
select @y;
Select ne, nom into @my_ne, @my_nom from emp where ne=7369; Select
@my_ne, @my_nom;
Paramètres en entrée : IN
Exemple
Les paramètres des procédures sont en entrée par défaut : IN par défaut : il est facultatif. Exemple
1
drop procedure if exists testSelect; delimiter
//
create procedure testSelect(IN my_job varchar(9)) begin
select my_job, avg(sal)
from emp where job =
my_job; end ; // delimiter
;
On aurait pu écrire :
create procedure testSelect(IN my_job varchar(9))
Exemple 2
drop procedure if exists testSelectInto; delimiter //
create procedure testSelectInto(my_job varchar(9)) begin
declare somSal float(7,2);
select sum(sal) into somSal from
emp
where job = my_job;
select somSal; end ;
//
delimiter ;
Utilisation « statique »
On peut passer toutes les commandes du DDL, du DML et du DCL (grant, revoke, commit,
rollback) à une procédure.
-- pour vérifier
Select @requete;
Types numériques
INT, integer, bigint
DECIMAL (nb1 chiffres max, nb2 chiffres après la virgule max) : virgule fixe, pour les
Mathématiques de précision, équivalent à NUMERIC, DEC et FIXED,
FLOAT (4 octets), REAL, DOUBLE PRECISON (8 octets) : virgule flottante.
Exemples
Opérateurs de comparaison :
>, <, <=, >=, BETWEEN, NOT BETWEEN, IN, NOT IN, =, <>, !=, like, regexp (like étendu),
isnull, is not null, <=>.
Opérateurs mathématiques :
+, -, *, /, DIV, %
Opérateurs logiques :
Fonctions numériques :
abs, power, sqrt, ceiling, greatest, mod, rand, etc.
Fonctions de transtypage :
cast et convert
Autres fonctions
Tests – IF – ELSE -
ELSEIF
Syntaxe
IF expression THEN instructions
[ ELSEIF expression THEN
instructions ]
[ ELSE
instructions ] END IF;
CASE WHEN
Syntaxe
CASE expression
WHEN valeurs THEN
instructions [WHEN
Boucle While
Syntaxe
[ label : ] WHILE expression DO
instructions END WHILE [
label ] ;
Exemple
drop procedure if exists testWhile; delimiter //
create procedure testWhile(n int, OUT somme int)
comment ‘testWhile’ begin
declare i int; set somme
=0; set i = 1; while i
<=n do set somme = somme +
i; set i = i+1; end
while; end;
//
delimiter ;
Syntaxe
[ label : ] REPEAT
instructions
UNTIL expression END REPEAT [ label ] ;
Boucle sans fin
Syntaxe
[ label : ] LOOP
instructions END LOOP
[ label ] ;
Syntaxe
[ monLabel : ] DEBUT_DE_BOUCLE
LEAVE monLabel ;
FIN_DE_BOUCLE [monLabel ] ;
L’instruction « leave » permet de quitter n’importe quel bloc d’instruction précédé par le nom
d’un label. C’est un « goto » structuré.
Blocs imbriqués
On peut déclarer des blocs d’instructions à tout moment dans une procédure.
Quand on déclare un bloc d’instruction, on peut y associer de nouvelles déclarations de variables.
Syntaxe
[ label : ] BEGIN
[ déclaration de variable . . .] ;
instructions
END [ label ] ;
Résultats
mysql> call testCurseur;
+------+------+-------+---------+
| i | vne | vnom | vjob |
+------+------+-------+---------+
| 1 | 7566 | JONES | MANAGER |
+------+------+-------+---------+
1 row in set (0.01 sec)
+------+------+-------+---------+
| i | vne | vnom | vjob |
+------+------+-------+---------+
| 2 | 7698 | BLAKE | MANAGER |
+------+------+-------+---------+
1 row in set (0.01 sec)
+------+------+-------+---------+
| i | vne | vnom | vjob |
+------+------+-------+---------+
| 3 | 7782 | CLARK | MANAGER |
+------+------+-------+---------+
1 row in set (0.01 sec)
Présentation
Les fonctions n’ont qu’un paramètre en sortie qui est renvoyé par le return. Donc,
tous les paramètres de l’en-tête sont en entrée : on ne le précise pas.
Remarque
Le mot clé « deterministic » est obligatoire bien qu’il ne serve à rien !
http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html
Synthèse et méthode
Orienté Objet
Les procédures stockées permettent de fournir un jeu de méthodes associées à une table, comme
pour une classe en programmation objet. Ca peut être au moins les INSERT, UPDATE, DELETE,
mais aussi n’importe quel SELECT. On peut ensuite ne donner l’accès qu’à ces procédures
stockées aux développeurs.
Orienté Admin
Les procédures stockées permettent de faire de l’administration en utilisant par exemple les
données du dictionnaire des données et du SQL dynamique.
Méthode de codage
0. MySQL Workbench
Pour écrire les procédures stockées et triggers, on peut utiliser le MySQL Workbench.
Présentation
MySQL Workbench fournit aux DBAs et aux développeurs un environnement de développement
intégré pour :
• La conception de la BD
• Le développement SQL (MySQL Workbench remplace MySQL Tools : MySQL
administrator et MySQL Query Browser)
• L’administration de la BD
Téléchargement
http://www.mysql.fr/downloads/workbench/
Télécharger : Windows (x86, 32-bit), MSI Installer
Résultats de l’installation
Répertoire d’installation
C:\Program Files\MySQL\MySQL Workbench 5.2 CE
Fichier exécutable
C:\Program Files\MySQL\MySQL Workbench 5.2 CE\MySQLWorkbench.exe
Principes du fonctionnement
3 usages
• SQL developement
• Data Modeling
• Server Administration
SQL developement
Si le server MySQL est lancé, quand on clique sur le « local instance MySQL » ça ouvre une
fenêtre qui donne accès à un « browser » avec les BD déjà enregistrées sur le serveur et à une
fenêtre qui permet de passer des commandes SQL.
SQL Administration
Si le server MySQL est lancé, quand on clique sur le « local MySQL » ou sur « Server
Administration, ça ouvre une fenêtre qui permet de faire de l’administration : suivre l’état du
serveur, gérer les paramètres de configuration, gérer les utilisateurs, gérer les import-export de
BD.
Data Modeling
• Create new EER model / add diagram : on peut créer des tables et des liaisons et enregistrer
le modèle
• Open existing EER model : permet d’ouvrir un modèle précédemment enregistré
• Create EER model from existing database : permet de créer un modèle à partir d’une BD
déjà enregistrée sur le serveur
• Create EER model from SQL script : permet de créer un modèle à partir d’un fichier script
SQL.
10) Rajouter le trigger qui permet de gérer l’attribut « emprunté », booléen permettant de savoir
si un livre est emprunté ou pas (cf. TP précédent).
11) Vérifier que ce trigger fonctionne avec la procédure stockée de l’exercice précédent.
12) Créer la procédure stockée qui permette d’enregistrer un retour en gérant tous les cas d’erreur
(le livre n’existe pas, l’adhérent n’existe pas, le livre n’est pas emprunté, etc.) et en imposant
la date du jour comme date de retour. La procédure renverra un numéro de code pour chaque
erreur et le nombre de jour de retard s’il y a lieu.
Dans la BD Ecoling, écrire une fonction qui permet d’afficher, pour un examen donné, la
moyenne des notes, la meilleure note et le ou les noms des élèves, la plus basse note et le ou les
noms des élèves (group_concat), pour chacune des épreuves.