Część 1
Ograniczniki są używane dla obiektów źródłowych, takich jak procedura składowana/funkcja, wyzwalacz lub zdarzenie. Wszystkie te obiekty mogą mieć treść - kod w klauzuli BEGIN...END.
Wszystkie instrukcje w skryptach MySQL powinny być zakończone ogranicznikiem, domyślnie jest to ';'. Ale co zrobić, jeśli obiekt źródłowy ma ciało z pewnymi instrukcjami, np.:
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);
Ile oświadczeń? 3 czy 8? Odpowiedź to trzy, ponieważ skrypt zawiera dwie instrukcje INSERT i jedną instrukcję CREATE PROCEDURE. Jak widać, CREATE PROCEDURE zawiera również pewne wewnętrzne instrukcje; powinniśmy powiedzieć klientowi MySQL, że wszystkie te instrukcje (wewnątrz BEGIN...END) - są częścią JEDNEJ instrukcji; możemy to zrobić za pomocą ograniczników:
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);
Zauważ, że jeśli twój wyzwalacz nie ma klauzuli BEGIN...END, ograniczniki mogą zostać pominięte.
Część 2
Wyrażenie bez ograniczników zostanie przeanalizowane jako -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
zamiast -
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