为什么SQLYog在创建MySQL存储过程时会更改分隔符?

时间:2011-06-13 05:01:10

标签: mysql stored-procedures delimiter sqlyog

当我使用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分隔符(我想这可能是因为范围)。

1 个答案:

答案 0 :(得分:2)

将语句分隔符更改为$$,以防止MySQL尝试将存储过程中的任何分号解释为分隔符。如果没有DELIMITER $$,您将无法定义包含;的存储过程来分隔其中的语句。您可以将其视为在过程定义期间全局转义分号的方法。

来自fine manual

  

要重新定义 mysql 分隔符,请使用delimiter命令。以下示例显示了如何对刚刚显示的dorepeat()过程执行此操作。分隔符更改为//以使整个定义作为单个语句传递到服务器,然后在调用过程之前还原到;。这使得过程体中使用的;分隔符可以传递到服务器,而不是由 mysql 本身解释。

我不知道我的解释是否比手册更清楚,但也许其中一个(或两者合并)将导致一些理解。