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

2023-10-26数据库问题
0

本文介绍了是否可以从 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 存储过程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

Mysql目录里的ibtmp1文件过大造成磁盘占满的解决办法
ibtmp1是非压缩的innodb临时表的独立表空间,通过innodb_temp_data_file_path参数指定文件的路径,文件名和大小,默认配置为ibtmp1:12M:autoextend,也就是说在文件系统磁盘足够的情况下,这个文件大小是可以无限增长的。 为了避免ibtmp1文件无止境的暴涨导致...
2025-01-02 数据库问题
151

SQL 子句“GROUP BY 1"是什么意思?意思是?
What does SQL clause quot;GROUP BY 1quot; mean?(SQL 子句“GROUP BY 1是什么意思?意思是?)...
2024-04-16 数据库问题
62

MySQL groupwise MAX() 返回意外结果
MySQL groupwise MAX() returns unexpected results(MySQL groupwise MAX() 返回意外结果)...
2024-04-16 数据库问题
13

MySQL SELECT 按组最频繁
MySQL SELECT most frequent by group(MySQL SELECT 按组最频繁)...
2024-04-16 数据库问题
16

为什么 Mysql 的 Group By 和 Oracle 的 Group by 行为不同
Why Mysql#39;s Group By and Oracle#39;s Group by behaviours are different(为什么 Mysql 的 Group By 和 Oracle 的 Group by 行为不同)...
2024-04-16 数据库问题
13

MySQL GROUP BY DateTime +/- 3 秒
MySQL GROUP BY DateTime +/- 3 seconds(MySQL GROUP BY DateTime +/- 3 秒)...
2024-04-16 数据库问题
14