Част 1
Разделителите се използват за изходни обекти като съхранена процедура/функция, тригер или събитие. Всички тези обекти може да имат тяло - код в рамките на клауза BEGIN...END.
Всички изрази в MySQL скриптове трябва да завършват с разделител, по подразбиране е ';'. Но какво да направите, ако изходният обект има тяло с някои изрази, напр.:
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);
Колко изявления? 3 или 8? Отговорът е три, защото скриптът има два оператора INSERT и един CREATE PROCEDURE. Както виждате, CREATE PROCEDURE също има някои вътрешни изрази; трябва да кажем на MySQL клиента, че всички тези изрази (вътре в BEGIN...END) - са част от ЕДИН оператор; можем да го направим с помощта на разделители:
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);
Имайте предвид, че когато задействането ви няма клауза BEGIN...END, разделителите може да бъдат пропуснати.
Част 2
Без разделители операторът ще бъде анализиран като -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
вместо -
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