Lors de l'utilisation de l'éditeur de procédure intégré, MySQL Workbench ajoute quelques commandes supplémentaires :
USE `test`; // <----------
DROP procedure IF EXISTS `p2`; // <----------
DELIMITER $$
USE `test`$$ // <----------
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
END $$
DELIMITER ; // <----------
Ces commandes ne sont pas strictement liées à la syntaxe des procédures stockées, elles ne sont qu'une marchandise - d'autres clients MySQL (tels que HeidiSQL ou l'utilitaire de ligne de commande officiel) ne les ajouteront pas. Le dernier changement de délimiteur est probablement une réinitialisation pour éviter des problèmes dans les déclarations futures sur la même connexion.
Vous devez modifier le délimiteur afin d'indiquer au client où commence et se termine le code de la procédure. Le problème est que le corps de la procédure est normalement une collection d'instructions SQL, donc omettre le changement de délimiteur ferait penser à MySQL que vous essayez d'exécuter une série d'instructions, dont la première serait celle-ci :
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
Avec DELIMITER $$
vous dites à MySQL que votre déclaration complète va de CREATE
à END
. C'est juste du sucre syntaxique :DELIMITER
n'est même pas un mot-clé SQL. HeidiSQL, par exemple, fournit une interface graphique avec une zone de texte dans laquelle vous écrivez le corps de la procédure, vous n'avez donc pas besoin de la solution de contournement DELIMITER.