MySQL中的一个简单的存储过程:
CREATE PROCEDURE `proc01`()
BEGIN
SELECT * FROM users;
END
启动Rails控制台:
$ script/console
Loading development environment (Rails 2.3.5)
>> User.connection.execute("CALL proc01")
=> #<Mysql::Result:0x10343efa0>
看起来不错。但是,通过现有连接再次调用同一存储过程将导致命令不同步错误:
>> User.connection.execute("CALL proc01")
ActiveRecord::StatementInvalid: Mysql::Error: Commands out of sync; you can't run this command now: CALL proc01
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract_adapter.rb:219:in `log'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/mysql_adapter.rb:323:in `execute'
from (irb):2
错误可以通过“重新加载”来清除!控制台中的命令:
>> reload!
Reloading...
=> true
>> User.connection.execute("CALL proc01")
=> #<Mysql::Result:0x1033f14d0>
>>
如何从Rails调用MySQL存储过程?
答案 0 :(得分:5)
修改强>
<强> - 强>
使用ActiveRecord::Base.connections.exec_query()
就像我可以告诉 MUCH 更好的方法,因为它返回了一个人们期望的哈希数组,ActiveRecord::Base.connections.execute
没有。
<强> - 强>
请阅读上面的编辑内容,我将离开以下内容以供参考。
虽然我意识到这个问题已经很老了,因为发布的链接有很多,但我最近也有同样的错误。
我能够通过执行以下操作来修复它:
result = ActiveRecord::Base.connection.execute("call example_proc()")
ActiveRecord::Base.clear_active_connections!
一旦清除了连接,就可以运行任何其他查询,就像之前尝试通过rails或其他存储过程访问数据库一样失败。
http://apidock.com/rails/v3.2.13/ActiveRecord/Base/clear_active_connections%21/class
- 编辑:
还值得一提的是,不应该根据leente的帖子将ActiveRecord连接存储在变量中link
“不要缓存它!
不要在变量中存储连接,因为当另一个线程已经重新连接到连接池时,它可能会尝试使用它。请参阅:ConnectionPool“
connection = ActiveRecord::Base.connection #WRONG
threads = (1..100).map do
Thread.new do
begin
10.times do
connection.execute("SELECT SLEEP(1)") # WRONG
ActiveRecord::Base.connection.execute("SELECT SLEEP(1)") # CORRECT
end
puts "success"
rescue => e
puts e.message
end
end
end
threads.each(&:join)