Část 1
Oddělovače se používají pro zdrojové objekty, jako je uložená procedura/funkce, spouštěč nebo událost. Všechny tyto objekty mohou mít tělo - kód v klauzuli BEGIN...END.
Všechny příkazy ve skriptech MySQL by měly být ukončeny oddělovačem, výchozí je ';'. Ale co dělat, když má zdrojový objekt tělo s nějakými příkazy, např.:
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);
Kolik prohlášení? 3 nebo 8? Odpověď je tři, protože skript má dva příkazy INSERT a jeden příkaz CREATE PROCEDURE. Jak vidíte, CREATE PROCEDURE má také některé interní příkazy; měli bychom říci klientovi MySQL, že všechny tyto příkazy (uvnitř BEGIN...END) - jsou součástí JEDNOHO příkazu; můžeme to udělat pomocí oddělovačů:
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);
Všimněte si, že když váš spouštěč nemá klauzuli BEGIN...END, oddělovače mohou být vynechány.
Část 2
Bez oddělovačů bude příkaz analyzován jako -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
místo -
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