Parte 1
I delimitatori vengono utilizzati per oggetti di origine come stored procedure/funzioni, trigger o eventi. Tutti questi oggetti possono avere un codice corpo all'interno della clausola BEGIN...END.
Tutte le istruzioni negli script MySQL devono essere terminate con delimitatore, il valore predefinito è ';'. Ma cosa fare se l'oggetto sorgente ha un corpo con alcune istruzioni, ad esempio:
INSERT INTO table1 VALUES(1);
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
PREPARE stmt2 FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
END;
INSERT INTO table1 VALUES(2);
Quanti statisti? 3 o 8? La risposta è tre, perché lo script ha due INSERT e un'istruzione CREATE PROCEDURE. Come vedi, CREATE PROCEDURE ha anche alcune istruzioni interne; dovremmo dire al client MySQL che tutte queste istruzioni (all'interno di BEGIN...END) - fanno parte di UNA istruzione; possiamo farlo con l'aiuto dei delimitatori:
INSERT INTO table1 VALUES(1);
DELIMITER $$
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
PREPARE stmt2 FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
END$$
DELIMITER ;
INSERT INTO table1 VALUES(2);
Nota, quando il trigger non ha la clausola BEGIN...END, i delimitatori possono essere omessi.
Parte 2
Senza delimitatori l'istruzione verrà analizzata come -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
invece di -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
PREPARE stmt2 FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
END