从Rails 3调用MySQL存储过程(返回结果集)时出错

时间:2010-10-11 00:15:22

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

我从我的模型调用存储过程(MySQL)。此存储过程返回结果集,但我收到此错误...

  

Mysql2 ::错误:程序   my_db.sp_venue_nearby_with_questions   无法返回给定的结果集   上下文:....

这是我使用的rails代码 -

connection.select_all("call sp_some_proc()")

我也试过“connection.execute”,也失败了。我已经成功地从我的模型中调用了另一个存储过程,但是那个没有返回结果集。

1 个答案:

答案 0 :(得分:2)

我尝试使用MySQL 2 gem,它在Rails 3中默认使用,并得到了类似的错误。问题是默认情况下MySQL 2 gem不使用MULTI_STATEMENTS,当您想要从过程中获取结果集时,需要使用它。

经过一番调查后,我决定坚持使用adapter:mysql中的原始MySQL gem(adapter:mysql2而不是database.yml),这似乎也适用于Rails 3。

这是我为了将存储过程的结果传递给ActiveRecord类而做的事情:

db = ActiveRecord::Base.connection.raw_connection
entries = Entry.find_by_sql( 'CALL sp_get_all_entries()' )

# we need to flush the result set otherwise following SQL statements cannot be processed
db.next_result if ( db.more_results? )

现在,存储过程返回的行将在条目对象上可用,例如

entries.each do |entry|
    puts entry.name
    puts entry.extra_column_from_sp
end

请注意,您可以在SP中添加额外的列。这些额外的列将始终为“String”类型,因此您可能需要转换它们,例如约会。