mysql从学说原始sql创建过程的问题
Posted
技术标签:
【中文标题】mysql从学说原始sql创建过程的问题【英文标题】:Problems with mysql create procedure from doctrine raw sql 【发布时间】:2013-10-20 19:50:42 【问题描述】:我正在使用 Symfony2 中的一个应用程序项目。 通过注册,每个客户都会创建一个数据库。 模式是在客户端登录时由验证服务创建的。 应用程序需要一些数据才能工作,到目前为止,我使用了 ORM 固定装置。 由于多种原因,我现在需要从固定装置负载转移到更接近数据库。 我创建了一个存储过程(mysql),它将替换所有数据加载。该过程有效,但我需要在每个数据库中与架构一起创建此过程。 为此,我使用了学说原始 sql,但我无法通过 create procedure 语句的第一行来解决问题。似乎与'delimiter $$'有关。
在使用 sql 语句执行服务时,我得到:
"message":"执行'delimiter $$时出现异常\r\n\r\nCREATE DEFINER=root
@`localhost"
这似乎是因为换行但我不确定。任何人都知道解决这个问题的方法吗?
【问题讨论】:
使用不同的分隔符怎么样?显然 $ 是 php 的特殊字符。 感谢您的回答。我试过:DELIMITER // CREATE DEFINER=root
@localhost
PROCEDURE sp_register
(IN user_id INT) DETERMINISTIC COMMENT 'Registration procedure' BEGIN INSERT INTO metatitle(column1) SELECT 'example' as column1;结束 // 分隔符 ;从 mysql 工作台,只要我在 DELIMITER 之后包含一个换行符,它就可以正常工作 // 如果我在一行中执行,我没有得到任何响应。
您是否尝试在字符串周围使用双引号并在需要时使用“\n”字符作为换行符?
是的,我试过了,但没有成功。我将尝试另一种解决方案,并使用 Symfony 中的原始 sql 库构建一个服务层。我的意图是使用参数调用服务并在 raw-sql 字符串上使用 replace 使其像存储过程一样工作。这样我就可以从应用程序中更好地控制它而不会丢失功能。谢谢您的帮助。如果您想出另一个解决方案,我很想知道。
【参考方案1】:
问题来自这样一个事实,即分隔符命令只能在使用 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;
【讨论】:
【参考方案2】:您或许应该覆盖 CREATE DEFINER,因为在您将启动您的过程的系统中,root@localhost 不是 mysql 或数据库用户。
【讨论】:
是的,你可能是对的。但到目前为止,我的问题是从教义原始 sql 创建过程。如果我通过当前问题,我将很高兴跟进此问题【参考方案3】:我知道这是一个迟到的答案,但是这篇文章在 Google 的搜索结果中排名靠前,我在其他地方没有找到其他答案,所以我想发布一个如何解决这个问题的解决方案。
长话短说,必须在查询中用 \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"
);
【讨论】:
以上是关于mysql从学说原始sql创建过程的问题的主要内容,如果未能解决你的问题,请参考以下文章