'DELIMITER $$' 附近的错误

ish*_*007 5 ruby mysql ruby-on-rails delimiter

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

mysql> DELIMITER $$
mysql>
Run Code Online (Sandbox Code Playgroud)

没有错误。

ActiveRecord::Base.connection.execute(%Q{
    DELIMITER $$
})
Run Code Online (Sandbox Code Playgroud)

给出:

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: 
Run Code Online (Sandbox Code Playgroud)

que*_*luz 5

上面的答案是正确的(Rails 无法执行DELIMITER,因为它是 MYSQL 命令),但是 @ishandutta2007 的后续问题没有得到解答,所以我将在这里回答。

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

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

execute <<-SQL
  DROP FUNCTION IF EXISTS MyFunc;
  DELIMITER $$
  CREATE FUNCTION My Func
    . . .
  $$
  DELIMITER ;
SQL
Run Code Online (Sandbox Code Playgroud)

相反,将变成以下内容,execute通过重新定义分隔符来充当“范围界定”:

execute 'DROP FUNCTION IF EXISTS MyFunc'
execute <<-SQL
  CREATE FUNCTION My Func
    . . .
SQL
Run Code Online (Sandbox Code Playgroud)


Jon*_*rns 3

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] (4认同)