5

我正在使用 Symfony2 中的一个应用程序项目。通过注册,每个客户都会创建一个数据库。模式是在客户端登录时由验证服务创建的。应用程序需要一些数据才能工作,到目前为止,我使用了 ORM 固定装置。由于多种原因,我现在需要从固定装置负载转移到更接近数据库。我创建了一个存储过程(mysql),它将替换所有数据加载。该过程有效,但我需要在每个数据库中与架构一起创建此过程。为此,我使用了学说原始 sql,但我无法通过 create procedure 语句的第一行传递问题。似乎与“分隔符$$”有关。

root使用 sql 语句执行服务时,我得到:“消息”:“执行 'delimiter $$\r\n\r\nCREATE DEFINER= @`localhost”时发生异常

这似乎是因为换行符,但我不确定。有人知道解决这个问题的方法吗?

4

3 回答 3

8

问题来自这样一个事实,即 delimiter 命令只能在使用 MySQL 命令行工具时使用,如http://dev.mysql.com/doc/refman/5.1/en/stored-programs-defining.html所述。要解决此问题,您需要删除要更改分隔符的部分并使用 ; 作为你的分隔符。考虑以下:

delimiter $$

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
   SET @x = 0;
   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END$$

以上将不起作用,但以下将:

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
    SET @x = 0;
    REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;
于 2014-01-03T18:41:35.643 回答
0

您或许应该覆盖 CREATE DEFINER,因为在您将启动您的过程的系统中,root@localhost 不是 mysql 或数据库用户。

于 2013-10-12T23:04:10.240 回答
0

我知道这是一个迟到的答案,但是这篇文章在谷歌的结果中很高,我在其他地方没有找到其他答案,所以我想发布一个解决方案来解决这个问题。

长话短说,必须在查询中使用 \n 字符来换行,例如:

$this->addSql(
    "CREATE EVENT event_example ON SCHEDULE EVERY 15 MINUTE ".
    "ON COMPLETION NOT PRESERVE ENABLE DO BEGIN\n".
    "INSERT INTO archives SELECT * FROM records;\n".
    "DELETE FROM records;\n".
    "END"
);
于 2017-11-15T12:58:38.123 回答