Is it possible to call a MySQL stored procedure from Ruby?(是否可以从 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 存储过程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:是否可以从 Ruby 调用 MySQL 存储过程?
- 更改自动增量起始编号? 2021-01-01
- SQL 临时表问题 2022-01-01
- 使用 Oracle PL/SQL developer 生成测试数据 2021-01-01
- 以一个值为轴心,但将一行上的数据按另一行分组? 2022-01-01
- 远程 mySQL 连接抛出“无法使用旧的不安全身份验证连接到 MySQL 4.1+"来自 XAMPP 的错误 2022-01-01
- 导入具有可变标题的 Excel 文件 2021-01-01
- 如何使用 pip 安装 Python MySQLdb 模块? 2021-01-01
- 如何将 SonarQube 6.7 从 MySQL 迁移到 postgresql 2022-01-01
- 如何将 Byte[] 插入 SQL Server VARBINARY 列 2021-01-01
- 在SQL中,如何为每个组选择前2行 2021-01-01