Deel 1
De scheidingstekens worden gebruikt voor bronobjecten zoals opgeslagen procedure/functie, trigger of gebeurtenis. Al deze objecten kunnen een body - code hebben binnen de BEGIN...END-clausule.
Alle instructies in MySQL-scripts moeten worden afgesloten met een scheidingsteken, de standaard is ';'. Maar wat te doen als het bronobject body heeft met enkele statements, bijvoorbeeld:
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);
Hoeveel verklaringen? 3 of 8? Het antwoord is drie, omdat het script twee INSERT's en één CREATE PROCEDURE-statement heeft. Zoals je ziet, heeft CREATE PROCEDURE ook enkele interne verklaringen; we zouden tegen de MySQL-client moeten zeggen dat al deze verklaringen (binnen BEGIN...END) - deel uitmaken van EEN verklaring; we kunnen het doen met behulp van scheidingstekens:
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);
Let op, als uw trigger geen BEGIN...END-clausule heeft, kunnen scheidingstekens worden weggelaten.
Deel 2
Zonder scheidingstekens wordt de instructie geparseerd als -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
in plaats van -
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