Ao usar o editor de procedimentos integrado, o MySQL Workbench adiciona alguns comandos extras:
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 ; // <----------
Esses comandos não estão estritamente relacionados à sintaxe de procedimentos armazenados, eles são meramente uma mercadoria—outros clientes MySQL (como HeidiSQL ou o utilitário de linha de comando oficial) não irão adicioná-los. A última alteração do delimitador é provavelmente uma redefinição para evitar problemas em instruções futuras na mesma conexão.
Você precisa alterar o delimitador para instruir o cliente sobre onde o código do procedimento começa e termina. O problema é que o corpo do procedimento é normalmente uma coleção de instruções SQL, então omitir a alteração do delimitador faria o MySQL pensar que você está tentando executar uma série de instruções, a primeira das quais seria esta:
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
Com
DELIMITER $$
você está dizendo ao MySQL que sua instrução completa vai de CREATE
para END
. É apenas açúcar sintático:DELIMITER
nem é uma palavra-chave SQL. O HeidiSQL, por exemplo, fornece uma GUI com uma caixa de texto onde você escreve o corpo do procedimento, portanto, você não precisa da solução alternativa DELIMITER.