Le support des commandes préparées coté serveur a été ajouté en MySQL 4.1. Ce support tire profit du protocole client/serveur plus efficace, en supposant que vous utilisez la bonne interface client. Les interfaces correctes sont l'API C MySQL (pour les programmes en C), et MySQL Connector/J (pour les programmes Java). Par exemple, l'API C fournit un jeu de fonctions qui prépare les commandes. See Section 24.2.4, « Fonctions C de commandes préparées ». Les autres interfaces de langages peuvent fournir un support pour les commandes préparées, en utilisant le protocole binaire grâce à l'interface du client C. L'extension PHP 5 mysqli est un exemple.
Depuis MySQL 4.1.3, une interface alternative pour les commandes préparées est disponible : la suntaxe SQL pour les commandes préparées. Cette interface n'est pas aussi efficace que le protocole binaire, mais elle n'impose aucune programmation, car elle est disponible directement au niveau SQL.
Vous pouvez l'utiliser lorsqu'aucune interface de programmation n'est disponible.
Vous pouvez l'utiliser depuis n'importe quel programme qui vous permet d'envoyer des commandes au serveur, comme le client mysql.
Vous pouvez l'utiliser même si le client utilise une vieille version de la bibliothèque d'interface. La seule contrainte est que vous devez pouvoir vous connecter à un serveur suffisamment récent pour supporter cette syntaxe.
La syntaxe SQL pour les commandes préparées sert dans les situations suivantes :
Vous voulez tester les commandes préparées avec votre application sans faire de codage. Ou bien, votre application a des problèmes avec les commandes préparées, et vous voulez déterminer ce problème interactivement.
Vous voulez créer un cas de test qui décrit les problèmes que vous avez avec les commandes préparées, pour pouvoir envoyer un rapport de bogue.
Vous deve utiliser les commandes préparées, mais vous n'avez pas accès à une interface qui les supporte.
La syntaxe SQL pour les commandes préparées est basée sur 3 commandes SQL :
PREPAREstmt_name
FROMpreparable_stmt
; EXECUTEstmt_name
[USING @var_name
[, @var_name
] ...]; DEALLOCATE PREPAREstmt_name
;
La commande PREPARE
prépare la commande, lui
assigne le nom stmt_name
, qui sera
utilisé ultérieurement.
preparable_stmt
est soit une chaîne
littérale, soit une variable utilisateur, qui contient le texte
de la commande. Le texte doit représenter une seule commande SQL,
et non pas plusieurs. Dans la commande, le caractère
‘?
’ sert de variable de requête :
ils indiquent que les valeurs seront fournies à l'application
ultérieurement. Le caractère ‘?
’
ne doit pas être placé entre guillemets, même si vous voulez
leur donner des valeurs de chaînes de caractères.
Si une commande préparée existe déjà avec le même nom, elle sera détruite implicitement avant la préparation de la nouvelle commande. Cela signifie que si la nouvelle commande contient une erreur et ne peut pas être préparée, une erreur sera retournée, et la commande aura simplement été détruite.
Le contexte d'une commande préparée est celui de la session client dans laquelle elle est créée. Les autres clients ne peuvent y accéder.
Après avoir préparé une commande, vous l'exécutez avec la
commande EXECUTE
, qui fait référence au nom
de la commande préparée. Si la commande préparée contient des
variables, vous devez fournir leur valeur avec la clause
USING
qui liste les variables contenant les
valeurs des paramètres. Les valeurs des paramètres doivent être
aussi nombreuses que les paramètres de la commande.
Vous pouvez exécuter une commande préparée plusieurs fois, en lui passant différentes valeurs, ou différentes variables.
Pour détruire une commande préparée, utilisez la commande
DEALLOCATE PREPARE
. Tenter d'exécuter la
commande préparée après destruction conduit à une erreur.
Si vous quittez la session client sans libérer les commandes préparées, le serveur le fera pour vous.
Les exemples suivants montre deux méthodes équivalentes pour préparer les commandes qui calculent l'hypothénuse d'un triangle à partir de la taille de deux de ses cotés.
Le premier exemple montre comment créer la commande préparée avec une chaîne littérale :
mysql>PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql>SET @a = 3;
mysql>SET @b = 4;
mysql>EXECUTE stmt1 USING @a, @b;
+------------+ | hypotenuse | +------------+ | 5 | +------------+ mysql>DEALLOCATE PREPARE stmt1;
Le second exexemple est similaire, mais fournit le texte de la commande dans une variable utilisateur :
mysql>SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql>PREPARE stmt2 FROM @s;
mysql>SET @a = 6;
mysql>SET @b = 8;
mysql>EXECUTE stmt2 USING @a, @b;
+------------+ | hypotenuse | +------------+ | 10 | +------------+ mysql>DEALLOCATE PREPARE stmt2;
La syntaxe SQL des commandes préparées syntax ne peut pas être
utilisée par imbrication. C'est à dire, une commande passée à
PREPARE
ne peut pas exécuter les commandes
PREPARE
, EXECUTE
ou
DEALLOCATE PREPARE
.
De plus, la syntaxe SQL pour les commandes préparées est
distincte de l'API des commandes préparées. Par exemple, vous
pouvez utiliser la fonction C
mysql_stmt_prepare()
pour préparer une
commande PREPARE
, EXECUTE
,
or DEALLOCATE PREPARE
.
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.