CREATE PROCEDURE sp_name ([parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION sp_name ([parameter[,...]]) [RETURNS type] [characteristic ...] routine_body paramètre : [ IN | OUT | INOUT ] param_name type type : Any valid MySQL data type characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | SQL SECURITY {DEFINER | INVOKER} | COMMENT string routine_body : Commande(s) SQL valide(s)
La clause RETURNS
peut être spécifiée
uniquement pour une FUNCTION
. Elle sert à
indiquer le type de retour de la fonction, et le corps de la
fonction doit contenir une instruction RETURN
value
.
La liste de paramètre entre parenthèses est obligatoire. S'il
n'y a pas de paramètre, une liste vide sous la forme
()
doit être utilisée. Chaque paramètre
est un paramètre de type IN
par défaut.
Pour spécifier un autre type, utilisez les mots
OUT
ou INOUT
avant le nom
du paramètre. Spécifier IN
,
OUT
ou INOUT
n'est valable
que pour une PROCEDURE
.
L'instruction CREATE FUNCTION
est utilisée
dans les anciennes versions de MySQL pour créer des
UDF
(User Defined
Functions
, fonctions utilisateur). See
Section 27.2, « Ajouter des fonctions à MySQL ». Les UDF
sont toujours supportées, même avec la présence des
procédures stockées. Une UDF
peut être
considérée comme une fonction stockée. Cependant, notez que
les UDF
et les fonctions stockées partagent
le même espace de noms.
Un framework pour développer des procédures stockées externes sera prochainement présenté. Il permettra d'écrire des procédures stockées dans d'autres langages que SQL. Il est probable que l'un des premiers langages supportés sera PHP, car le moteur PHP est compact, compatible avec les threads et peut être facilement intégré. Comme ce framework sera public, il est probable que bien d'autres langages soient supportés.
Une fonction est considérée comme ``déterministe'' si elle
retourne toujours le même résultat pour les mêmes paramètres
d'entrée. Sinon, elle est considérée comme ``non
déterministe''. L'optimiseur peut utiliser cette propriété.
Actuellement, l'attribut DETERMINISTIC
est
accepté, mais il n'est pas encore utilisé.
L'attribut SQL SECURITY
peut être utilisé
pour spécifier si la routine doit être exécutée avec les
droits de l'utilisateur qui l'a créé ou avec ceux de celui qui
appelle la fonction. La valeur par défaut est
DEFINER
. Cette fonctionnalité est nouvelle
en SQL:2003.
MySQL n'utilise pas le droit GRANT EXECUTE
.
Pour le moment, si une procédure p1()
utilise la table t1
, l'appelant doit avoir
les droits sur la table t1
afin que la
procédure p1()
puisse réussir.
MySQL stocke la configuration SQL_MODE
en
effet au moment de la création de la procédure, et l'utilisera
toujours lors de l'exécution de la procédure.
La clause COMMENT
est une extension MySQL, et
peut servir à décrire la procédure stockée. Cette
information est affichée par les commandes SHOW CREATE
PROCEDURE
et SHOW CREATE FUNCTION
.
MySQL permet aux routines de contenir des commandes DDL, telle
que CREATE
et DROP
, et des
transactions SQL, comme COMMIT
. Ce n'est pas
obligatoire selon le standard et c'est donc une extension
spécifique.
Note : Actuellement, les
fonctions stockées FUNCTION
s ne doivent pas
contenir de références aux tables. Notez que cela inclut aussi
les commandes SET
, mais pas les commandes
SELECT
. Cette limitation sera supprimée
aussitôt que possible.
L'exemple suivant est une procédure stockée simple, qui
utilise un paramètre de sortie OUT
.
L'exemple utilise la commande delimiter
du
client mysql
pour modifier le délimiteur de
commande avant de définir la procédure. Cela permet au
délimiteur ;
d'être utilisé dans le corps
de la procédure, plutôt que d'être interprété par le client
mysql
.
mysql>delimiter |
mysql>CREATE PROCEDURE simpleproc (OUT param1 INT)
->BEGIN
->SELECT COUNT(*) INTO param1 FROM t;
->END
->|
Query OK, 0 rows affected (0.00 sec) mysql>CALL simpleproc(@a)|
Query OK, 0 rows affected (0.00 sec) mysql>SELECT @a|
+------+ | @a | +------+ | 3 | +------+ 1 row in set (0.00 sec)
L'exemple suivant est une fonction qui prend un paramètre, effectue une opération avec une fonction SQL, et retourne le résultat :
mysql>delimiter |
mysql>CREATE FUNCTION bonjour (s CHAR(20)) RETURNS CHAR(50)
->RETURN CONCAT('Bonjour, ',s,'!');
->|
Query OK, 0 rows affected (0.00 sec) mysql>SELECT bonjour('le monde')|
+---------------------+ | bonjour('le monde') | +---------------------+ | Bonjour, le monde! | +---------------------+ 1 row in set (0.00 sec)
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.