为什么仍然存放在铁轨(3+)不支持的程序?(Why are stored procedures st

2019-07-30 15:15发布

我熟悉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的?

Answer 1:

存储过程中轨支持。 该出你得到同步错误的是因为MULTI_STATEMENTS MySQL的标志不会被默认启用的Rails。 此标志允许程序返回大于1个的结果集。

看到这里,了解如何启用一个代码示例: https://gist.github.com/wok/1367987

存储过程制定出与MS SQL Server的盒子。

我一直在使用存储过程中,几乎所有我的MySQL和SQL Server基于轨道项目没有任何发行。



Answer 2:

这是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()从模型中的列和存储过程结果里面列的列表。 我敢肯定,这可以通过检查类的列进行仿制。



Answer 3:

这些谁遇到同步错误可能生成多个结果的程序。 你需要做这样的事情来处理它们:

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')")


文章来源: Why are stored procedures still not supported in Rails (3+)?