Teil 1
Die Trennzeichen werden für Quellobjekte wie gespeicherte Prozeduren/Funktionen, Trigger oder Ereignisse verwendet. Alle diese Objekte können einen Body-Code innerhalb der BEGIN...END-Klausel haben.
Alle Anweisungen in MySQL-Skripten sollten mit Trennzeichen enden, der Standardwert ist ';'. Aber was tun, wenn das Quellobjekt einen Körper mit einigen Anweisungen hat, z. B.:
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);
Wie viele Statements? 3 oder 8? Die Antwort ist drei, weil das Skript zwei INSERTs und eine CREATE PROCEDURE-Anweisung hat. Wie Sie sehen, hat CREATE PROCEDURE auch einige interne Anweisungen; Wir sollten dem MySQL-Client sagen, dass alle diese Anweisungen (innerhalb von BEGIN ... END) - Teil EINER Anweisung sind; wir können es mit Hilfe von Trennzeichen machen:
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);
Beachten Sie, dass Trennzeichen weggelassen werden können, wenn Ihr Trigger keine BEGIN...END-Klausel hat.
Teil 2
Ohne Trennzeichen wird die Anweisung als -
geparstCREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
statt -
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