【问题标题】:Error while invoking MySQL Stored procedure(that returns resultset) from Rails 3从 Rails 3 调用 MySQL 存储过程(返回结果集)时出错
【发布时间】:2010-10-11 00:15:22
【问题描述】:
我正在从我的模型中调用存储过程 (MySQL)。此存储过程返回一个结果集,但我收到此错误...
Mysql2::Error: 过程
my_db.sp_venue_nearby_with_questions
无法返回给定的结果集
上下文:....
这是我使用的 Rails 代码 -
connection.select_all("call sp_some_proc()")
我也尝试过“connection.execute”,但也失败了。我已经成功地从我的模型中调用了另一个存储过程,但是那个过程没有返回结果集。
【问题讨论】:
标签:
mysql
ruby-on-rails
stored-procedures
activerecord
【解决方案1】:
我在 Rails 3 中默认使用的 MySQL 2 gem 上尝试了同样的事情并得到了类似的错误。问题是默认情况下 MySQL 2 gem 不使用 MULTI_STATEMENTS,当您想从过程中获取结果集时需要它。
经过一番调查,我决定坚持使用原始的 MySQL gem(adapter:mysql 中的 adapter:mysql2,而不是 database.yml 中的 adapter:mysql2),这在 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”类型,因此您可能需要转换它们,例如约会。