【问题标题】: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”类型,因此您可能需要转换它们,例如约会。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2014-02-06
    • 2012-01-09
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多