运行存储过程给出错误无法在给定上下文中返回结果集

时间:2015-02-12 13:30:19

标签: mysql ruby-on-rails ruby-on-rails-3 stored-procedures

我知道这个问题已被多次询问过。但我尝试了解决方案,但它们对我不起作用。我有一个基于rails 3.2.12和ruby 1.9.2p180构建的Web应用程序。我有一个存储过程,它返回一个有5个内连接的查询数据。在这种情况下,返回多行约600。在本地,存储过程运行正常,没有问题。但是,当我在服务器上尝试它时,它正在抛出:

ActiveRecord::StatementInvalid: Mysql2::Error: PROCEDURE test.sp_procedure can't return a result set in the given context: call sp_procedure('2015-02-14 00:00:00 -0500', '2015-03-03 23:59:00 -0500', 5, '13')

我搜索了这个问题,发现在建立与MySQL服务器的连接时需要设置CLIENT_MULTI_RESULTS标志。为此,我已经完成了猴子修补。这是初始化程序中的文件:

module ActiveRecord
class Base
def self.mysql2_connection(config)
  config[:username] = 'deploy' if config[:username].nil?

  if Mysql2::Client.const_defined? :FOUND_ROWS
    config[:flags] = config[:flags] ? config[:flags] | Mysql2::Client::FOUND_ROWS : Mysql2::Client::FOUND_ROWS
  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

def self.select_sp(sql, name = nil)
  connection = ActiveRecord::Base.connection
  begin
    connection.select_all(sql, name)
  rescue NoMethodError
  ensure
    connection.reconnect! unless connection.active?
  end
end
end
end

在我的database.yml我添加了flags: <%= 65536 | 131072 %>并尝试使用flags: 131072。但它没有用。

但是使用以下作品:

client = Mysql2::Client.new(:host => "localhost", :username => "root", :flags => Mysql2::Client::MULTI_STATEMENTS )
result = client.query( 'CALL sp_procedure('2015-02-14 00:00:00 -0500', '2015-03-03 23:59:00 -0500', 5, '13')')

这也适用于服务器。但每次存储过程运行时,它都会创建一个我不想要的新连接。

当我在调用存储过程时,我在本地执行此操作时还要注意一件事,我必须执行此操作:

ActiveRecord::Base.connection.reconnect!

如果我不写这个,则会抛出错误:

ActiveRecord::StatementInvalid: Mysql2::Error: Commands out of sync; you can't run this command now

所以这也是同样的事情意味着它每次都创建一个新的连接。所以我找到了一个解决方案,使我免于这样做。 如果猴子修补是正确的那么我错过了什么。请帮忙。

0 个答案:

没有答案