6

Delimeter を mysql コンソールまたは MySQL Workbench から変更するとエラーは発生しませんが、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: 
4

2 に答える 2

4

一番上の回答は正しいです (Rails はDELIMITERMYSQL コマンドであるため実行できません) が、@ishandutta2007 のフォローアップの質問には回答がなかったので、ここで回答します。

DELIMITER多くの場合、mysql 関数およびプロシージャ本体をラップするために使用されます。Rails でこれを実現するには、プロシージャ本体を独自の execute ステートメントでラップするだけです。

たとえば、コードは次のようになります。

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
于 2015-05-19T19:42:40.567 に答える
3

DELIMITER実際には SQL ではなく、MySQL コマンド ライン設定です: http://dev.mysql.com/doc/refman/5.0/en/mysql-commands.html。つまり、この方法で区切り文字を設定することはできません。

ActiveRecord::Base.connection.executeその上、一度に 1 つのステートメントしか実行できないように設定しても役に立ちません( http://www.seanr.ca/tech/?p=75を参照)。

于 2013-03-27T10:55:44.750 に答える