我熟悉on Rails的,DB(MS)-drivers和存储过程红宝石之间的长期又爱又恨,自2.3.2版本,我一直在开发Rails应用程序。
然而,每一次的同时出现这样的情况SP简直比对(慢得多)应用级数据相结合更好的选择。 具体而言,运行的多个表中的结合数据报告通常更适合于SP。
为什么存储过程仍然集成如此糟糕到Rails或MySQL的宝石。 我目前正在与Rails的3.0.10和MySQL2宝石0.2.13一个项目,但据我所看到的,即使是最新的边缘轨道和MySQL的宝石,当你使用的SP 0.3+还大发脾气。
这一直是,现在仍然是问题,是一个SP被称为后,数据库连接丢失。
>> ActiveRecord::Base.connection.execute("CALL stored_proc")
=> #<Mysql::Result:0x103429c90>
>> ActiveRecord::Base.connection.execute("CALL stored_proc")
ActiveRecord::StatementInvalid: Mysql::Error: Commands out of sync;
[...]
>> ActiveRecord::Base.connection.active?
=> false
>> ActiveRecord::Base.connection.reconnect!
=> nil
>> ActiveRecord::Base.connection.execute("CALL proc01")
=> #<Mysql::Result:0x1034102e0>
>> ActiveRecord::Base.connection.active?
=> false
这是一个非常难以解决的问题,在技术上,还是这是一个设计选择通过Rails的?
存储过程中轨支持。 该出你得到同步错误的是因为MULTI_STATEMENTS
MySQL的标志不会被默认启用的Rails。 此标志允许程序返回大于1个的结果集。
看到这里,了解如何启用一个代码示例: https://gist.github.com/wok/1367987
存储过程制定出与MS SQL Server的盒子。
我一直在使用存储过程中,几乎所有我的MySQL和SQL Server基于轨道项目没有任何发行。
这是Postgres的执行存储过程返回MyClass的实例。
sql=<<-SQL
select * from my_cool_sp_with_3_parameters(?, ?, ?) as
foo(
column_1 <type1>,
column_2 <type2>
)
SQL
MyClass.find_by_sql([sql, param1, param2, param3]);
更换FOO()从模型中的列和存储过程结果里面列的列表。 我敢肯定,这可以通过检查类的列进行仿制。
这些谁遇到同步错误可能生成多个结果的程序。 你需要做这样的事情来处理它们:
raise 'You updated Rails. Check this duck punch is still valid' unless Rails.version == "3.2.15"
module ActiveRecord
module ConnectionAdapters
class Mysql2Adapter
def call_stored_procedure(sql)
results = []
results << select_all(sql)
while @connection.more_results?
results << @connection.next_result
end
results
end
end
end
end
这样调用:
ActiveRecord::Base.connection.call_stored_procedure("CALL your_procedure('foo')")