当我使用SQLYog创建存储过程时,它会给我这个模板:
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `apachelogs`.`test`()
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
END$$
DELIMITER ;
我想知道它为什么在创建存储过程之前更改分隔符。为什么我仍然可以在;
语句中使用create
分隔符(我想这可能是因为范围)。
答案 0 :(得分:2)
将语句分隔符更改为$$
,以防止MySQL尝试将存储过程中的任何分号解释为分隔符。如果没有DELIMITER $$
,您将无法定义包含;
的存储过程来分隔其中的语句。您可以将其视为在过程定义期间全局转义分号的方法。
来自fine manual:
要重新定义 mysql 分隔符,请使用
delimiter
命令。以下示例显示了如何对刚刚显示的dorepeat()
过程执行此操作。分隔符更改为//
以使整个定义作为单个语句传递到服务器,然后在调用过程之前还原到;
。这使得过程体中使用的;
分隔符可以传递到服务器,而不是由 mysql 本身解释。
我不知道我的解释是否比手册更清楚,但也许其中一个(或两者合并)将导致一些理解。