“DELIMITER $$”附近出错

Posted

技术标签:

【中文标题】“DELIMITER $$”附近出错【英文标题】:Error near 'DELIMITER $$' 【发布时间】:2013-03-27 10:41:07 【问题描述】:

当我从 mysql 控制台或 MySQL Workbench 更改 Delimeter 时,我没有收到任何错误, 但是当我在 ruby​​ on rails 中嵌入相同的代码时,我得到了错误

mysql> DELIMITER $$
mysql>

没有错误。

但是

ActiveRecord::Base.connection.execute(%Q
    DELIMITER $$
)

给予:

ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $$' at line 1: 

【问题讨论】:

【参考方案1】:

top answer 是正确的(Rails 无法执行DELIMITER,因为它是一个 MYSQL 命令),但是@ishandutta2007 的后续问题没有得到回答,所以我会在这里回答。

DELIMITER常用于包装mysql函数和过程体;要在 Rails 中实现这一点,只需将过程主体包装在它自己的执行语句中。

因此,例如代码可能如下所示:

execute <<-SQL
  DROP FUNCTION IF EXISTS MyFunc;
  DELIMITER $$
  CREATE FUNCTION My Func
    . . .
  $$
  DELIMITER ;
SQL

将改为如下,多个execute 调用充当重新定义分隔符的“作用域”:

execute 'DROP FUNCTION IF EXISTS MyFunc'
execute <<-SQL
  CREATE FUNCTION My Func
    . . .
SQL

【讨论】:

【参考方案2】:

DELIMITER 实际上是 MySQL 命令行设置,而不是 SQL:http://dev.mysql.com/doc/refman/5.0/en/mysql-commands.html。也就是说不能这样设置分隔符。

最重要的是,如果您可以ActiveRecord::Base.connection.execute 只允许您一次执行一个开箱即用的语句(请参阅http://www.seanr.ca/tech/?p=75),那也无济于事。

【讨论】:

那么如何从 rails 执行以下操作?[CODE] DELIMITER $$ CREATE PROCEDURE XYZ(IN t INT) BEGIN BLA BLA ... END$$ DELIMITER ;[/CODE]

以上是关于“DELIMITER $$”附近出错的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL/MariaDB 中创建存储过程时出错

Datasatge使用Datastage装载数据时候,报错:Missing record delimiter “”,saw EOF instead

MySQL存储过程 DELIMITER的作用及用法

Delphi:即使设置了 Delimiter,StringList Delimiter 也始终是空格字符

使用php的Mysql事件错误

delimiter关键字