1

当我用 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(我猜可能是因为范围)。

4

1 回答 1

2

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

来自精美手册

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

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

于 2011-06-13T05:28:31.190 回答