从rails中的mysql存储过程中获取多个结果集

时间:2010-11-08 23:10:22

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

我一直在寻找这方面的提示,到目前为止还没有真正的运气。使用mysql2 gem,尝试执行返回多个结果集的存储过程使我无法返回此上下文错误中的结果。我发现有人建议使用mysql gem(我无法找到两者之间有什么不同以及切换时可能遇到的内容的解释),并且我已经取得了更多进展。

这是我到目前为止所拥有的:

>> db = ActiveRecord::Base.connection.raw_connection
=> #<Mysql:0x1056ae3d8>
>> ActiveRecord::Base.connection.select_all("CALL p_rpt_test('', '');")
=> [{"Header"=>"Client,Project,Type,Due Date,Assigned To"}]
>> db.more_results?
=> true
>> db.next_result
Mysql::Error: Commands out of sync; you can't run this command now
        from (irb):3:in `next_result'
        from (irb):3

有没有人知道如何使用mysql2或mysql宝石来实现这一点?该应用程序正在运行rails 3.0.1。

2 个答案:

答案 0 :(得分:5)

好吧,我还没弄明白如何让AR这样做,所以我最终只是进入低级并使用mysql驱动程序本身,这主要是有效的...

data = Array.new
db = ActiveRecord::Base.connection.raw_connection
header = db.query("CALL #{self.proc}(#{args});")
header.each {|r| data << r}
if db.next_result
  rows = db.store_result
  rows.each {|r| data << r}
end

ActiveRecord::Base.connection.reconnect!

它有效,但我无法想象没有更好的方法。此外,我必须在此之后重新连接或我在下一个查询中收到错误,并且我还没有找到正确关闭会话的方法。哦,我必须使用mysql gem而不是mysql2。

Grrrrr。

答案 1 :(得分:0)

我们可以使用header.to_hash来获取哈希数组,或使用header.rows来获取数组数组。

关注此http://api.rubyonrails.org/classes/ActiveRecord/Result.html