Del 1
Avgränsarna används för källobjekt som lagrad procedur/funktion, trigger eller händelse. Alla dessa objekt kan ha en body - kod inom BEGIN...END-satsen.
Alla uttalanden i MySQL-skript ska avslutas med avgränsare, standard är ';'. Men vad ska man göra om källobjektet har en kropp med vissa uttalanden, t.ex.:
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);
Hur många statsman? 3 eller 8? Svaret är tre, eftersom skriptet har två INSERT- och en CREATE PROCEDURE-sats. Som du ser har CREATE PROCEDURE några interna uttalanden också; vi bör säga till MySQL-klienten att alla dessa uttalanden (inuti BEGIN...END) - är en del av EN sats; vi kan göra det med hjälp av avgränsare:
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);
Observera att när din utlösare inte har någon BEGIN...END-sats, kan avgränsare utelämnas.
Del 2
Utan avgränsare kommer satsen att tolkas som -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
istället för -
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