【问题标题】:Is it possible to call a MySQL stored procedure from Ruby?是否可以从 Ruby 调用 MySQL 存储过程?
【发布时间】:2009-01-23 01:21:24
【问题描述】:

当我尝试从 Rails 调用存储过程时,我得到了这个异常:

ActiveRecord::StatementInvalid: Mysql::Error: PROCEDURE pipeline-ws_development.match_save_all can't return a result set in the given context: call match_save_all()
    from /Users/otto/Projects/Futures/src/pipeline-ws/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:150:in `log'
    from /Users/otto/Projects/Futures/src/pipeline-ws/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:281:in `execute'
    from (irb):3

Rails Wiki that discusses a patch 中有一个页面用于解决此问题的 MySQL 适配器,但它已经过时并且似乎不再工作了。

配置代码正确启用存储过程,但在存储过程调用后仍然存在连接不同步的问题,并且新的call_sp 方法不再起作用。

关于如何使它工作的任何建议?

这是我正在使用的代码:

ActiveRecord::Base.connection("call storedproc()")

无论storedproc()是否返回任何结果,它都会抛出相同的异常。

【问题讨论】:

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


    【解决方案1】:

    我已经向 Rails 2.3.4 提交了一个补丁,它提供了一个配置选项来解决这个问题。请停在我的票旁边,并表示您对它的支持!

    https://rails.lighthouseapp.com/projects/8994/tickets/3151-mysql-adapter-update-to-enable-use-of-stored-procedures

    【讨论】:

      【解决方案2】:

      将过程包装在一个函数中会起作用吗?如果 Ruby 因未返回任何行而出现问题 (...can't return a result set in the given context...),这可能会解决它:

      分隔符 $ 创建过程 tProc() 开始 SET @a = '测试'; 结尾; $ 创建函数 tFunc() 返回整数 开始 调用 tProc(); 返回 1; 结尾; $ 分隔符; 从 DUAL 中选择 tFunc(); >> 1 从双重中选择@a; >> '测试'

      尽管实际上,这不是一个非常可扩展的解决方案。

      跟进:我在 Ruby/ActiveRecord 方面非常出色,但这个示例绝对有效

      ActiveRecord::Base.establish_connection(authopts) 类 TestClass > tf1

      使用CALL tProc() 会导致与您类似的错误。

      【讨论】:

      • 您的示例有效,但使用我们的存储过程我得到“错误 1415 (0A000):不允许从函数返回结果集”。我要和写它们的人谈谈,看看我们是否不能重写它们以返回像你的例子这样的东西。
      • 这推动了我们前进,但我们仍然有几个 procs 需要返回大量在变量中不起作用的数据。
      • 我继续接受,因为这似乎是目前最好的解决方案。返回大量数据的问题仍然存在,但是已经过去了几天,没有人想出更好的方法。如果不修复 MySQL 适配器,我认为它不存在。
      • 我有点不清楚——procs 可以返回数据吗?我相当肯定 MySQL 中的 procs 不会返回任何内容。你能详细说明一下吗?
      【解决方案3】:

      你在使用 ActiveRecord::Base.connection.execute 吗?此方法应该允许您执行一些在 Active Record 包装器中不受支持的任意 SQL 语句。

      【讨论】:

      • 这就是我正在使用的,我得到了那个例外。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多