是否可以从 Ruby 调用 MySQL 存储过程?

Is it possible to call a MySQL stored procedure from Ruby?(是否可以从 Ruby 调用 MySQL 存储过程?)
本文介绍了是否可以从 Ruby 调用 MySQL 存储过程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试从 Rails 调用存储过程时,出现此异常:

ActiveRecord::StatementInvalid: Mysql::Error: PROCEDURE pipeline-ws_development.match_save_all 无法返回给定上下文中的结果集:调用 match_save_all()来自/Users/otto/Projects/Futures/src/pipeline-ws/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:150:in `log'来自/Users/otto/Projects/Futures/src/pipeline-ws/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:281:in `execute'来自 (irb):3

Rails Wiki 中有一个页面讨论了 MySQL 的补丁解决此问题的适配器,但它已过时且似乎不再起作用.

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

有关如何使其工作的任何建议?

这是我正在使用的代码:

ActiveRecord::Base.connection("调用storedproc()")

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

解决方案

将过程包装在一个函数中是否可行?如果 Ruby 因没有返回行而导致呕吐(...无法在给定的上下文中返回结果集...),这可能会解决它:

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

虽然,实际上,这不是一个非常可扩展的解决方案.

跟进:我在 Ruby/ActiveRecord 方面很不擅长,但这个例子绝对有效

<前>ActiveRecord::Base.establish_connection(authopts)类 TestClass

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

When I try to call a stored procedure from Rails, I get this exception:

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

There is a page in the Rails Wiki that discusses a patch for the MySQL adapter that resolves this issue, but it's out-of-date and doesn't seem to work anymore.

The configuration code enables stored procedures correctly, but it still has the issue with the connection getting out of sync after a stored procedure call and the new call_sp method doesn't work anymore.

Any suggestions for how to get this working?

This is the code I'm using:

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

It throws the same exception whether storedproc() returns any results or not.

解决方案

Would it work to wrap the procedure in a function? If Ruby's barfing due to no rows returned (...can't return a result set in the given context...), this may fix it:

DELIMITER $

CREATE PROCEDURE tProc()
BEGIN
    SET @a = 'test';
END;
$

CREATE FUNCTION tFunc()
RETURNS INT
BEGIN
    CALL tProc();
    RETURN 1;
END;
$

DELIMITER ;

SELECT tFunc() FROM DUAL;
>> 1

SELECT @a FROM DUAL;
>> 'test'

Although, realistically, this isn't a very extensible solution.

Followup: I'm pretty n00by at Ruby/ActiveRecord, but this example definitely works

ActiveRecord::Base.establish_connection(authopts)

class TestClass < ActiveRecord::Base
end

test_class = TestClass.new
puts %{#{test_class.connection.select_one('SELECT tFunc() AS tf FROM DUAL')}}
>> tf1

Using CALL tProc() resulted in an error similar to yours.

这篇关于是否可以从 Ruby 调用 MySQL 存储过程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Hibernate reactive No Vert.x context active in aws rds(AWS RDS中的休眠反应性非Vert.x上下文处于活动状态)
Bulk insert with mysql2 and NodeJs throws 500(使用mysql2和NodeJS的大容量插入抛出500)
Flask + PyMySQL giving error no attribute #39;settimeout#39;(FlASK+PyMySQL给出错误,没有属性#39;setTimeout#39;)
auto_increment column for a group of rows?(一组行的AUTO_INCREMENT列?)
Sort by ID DESC(按ID代码排序)
SQL/MySQL: split a quantity value into multiple rows by date(SQL/MySQL:按日期将数量值拆分为多行)