我知道这个问题已被多次询问过。但我尝试了解决方案,但它们对我不起作用。我有一个基于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
所以这也是同样的事情意味着它每次都创建一个新的连接。所以我找到了一个解决方案,使我免于这样做。 如果猴子修补是正确的那么我错过了什么。请帮忙。