1

私のRubyプログラムは、ストアドプロシージャ(いくつかの計算を実行します)を呼び出し、Rubyコードを使用して電子メールで送信したい結果セットを返したいだけです。私はRailsを使用しておらず、単なるRubyとmysql2のgemを使用していることに注意してください。

require 'active_record'

ActiveRecord::Base.establish_connection(
  :adapter => "mysql2",
  :host  => "localhost",
  :database => "<mydb>",
  :username => "<myusername>",
  :password => "<mypassword>"
)

class Rubyist < ActiveRecord::Base  
end

rubyist = Rubyist.new
puts rubyist.connection.execute("CALL ruby_routine")

次のエラーが返されます

    Mysql2::Error: PROCEDURE students.ruby_routine can't return a result set in the given context: CALL ruby_routine (ActiveRecord::StatementInvalid)

今、私はこれをグーグルで検索してリンクを見つけましたが、それらはRailsアプリ用です。純粋なRubyでこれを行うにはどうすればよいですか?

4

2 に答える 2

1

ActiveRecordで使用されているmysql2コネクタから問題が発生すると思います。mysql2の人が彼らのドキュメントで言うように:

複数の結果セットを取得することもできます。これを機能させるには、フラグMysql2 :: Client::MULTI_STATEMENTSで接続する必要があります。複数の結果セットを使用することは、通常、複数の結果セットを返すストアドプロシージャを呼び出すときに使用されます。

したがって、デフォルトでは設定されていません。そうです、理想的には、mysql2アダプターを直接(ActiveRecordなしで)使用している場合は、次のようなフラグを渡します。

client = Mysql2::Client.new(:host => "localhost", :username => "root", :flags => Mysql2::Client::MULTI_STATEMENTS )

ただし、ActiveRecordを使用しているため、mysql2コネクタを上書きする必要があります。このような何かがトリックを行うことができます。

module ActiveRecord
  class Base
    # Establishes a connection to the database that's used by all Active Record objects.
    def self.mysql2_connection(config)
      config[:username] = 'root' if config[:username].nil?

      if Mysql2::Client.const_defined? :FOUND_ROWS
        config[:flags] = Mysql2::Client::FOUND_ROWS | Mysql2::Client::MULTI_STATEMENTS
      end

      client = Mysql2::Client.new(config.symbolize_keys)
      options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0]
      ConnectionAdapters::Mysql2Adapter.new(client, logger, options, config)
    end
  end
end 
于 2013-02-19T17:07:01.107 に答える
-2

あなたの問題は構文です。「rubyist」クラス内に「 Establish_connection 」メソッドを移動してみてください。

于 2013-02-19T16:08:09.300 に答える