【问题标题】:Error near 'DELIMITER $$'“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: 

【问题讨论】:

    标签: mysql ruby-on-rails ruby delimiter


    【解决方案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]
      猜你喜欢
      • 2017-01-15
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      相关资源
      最近更新 更多