Quando si utilizza l'editor di procedure integrato, MySQL Workbench aggiunge alcuni comandi extra:
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 ; // <----------
Questi comandi non sono strettamente correlati alla sintassi delle procedure memorizzate, sono semplicemente una merce:altri client MySQL (come HeidiSQL o l'utilità della riga di comando ufficiale) non li aggiungeranno. L'ultima modifica del delimitatore è probabilmente un ripristino per evitare problemi nelle istruzioni future sulla stessa connessione.
È necessario modificare il delimitatore per istruire il client su dove inizia e dove termina il codice della procedura. Il problema è che il corpo della procedura è normalmente una raccolta di istruzioni SQL, quindi omettere la modifica del delimitatore farebbe pensare a MySQL che stai tentando di eseguire una serie di istruzioni, la prima delle quali sarebbe questa:
CREATE PROCEDURE test.`p2` ()
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
SELECT 'Hello World';
Con DELIMITER $$
stai dicendo a MySQL che la tua dichiarazione completa va da CREATE
a END
. È solo zucchero sintattico:DELIMITER
non è nemmeno una parola chiave SQL. HeidiSQL, ad esempio, fornisce una GUI con una casella di testo in cui scrivi il corpo della procedura, quindi non hai bisogno della soluzione DELIMITER.