Part 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?答案是 3,因为脚本有两个 INSERT 和一个 CREATE PROCEDURE 语句。正如您所看到的,CREATE PROCEDURE 也有一些内部语句;我们应该对 MySQL 客户端说,所有这些语句(BEGIN...END 内) - 都是 ONE 语句的一部分;我们可以借助分隔符来做到这一点:
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 子句时,可以省略分隔符。
Part 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