一尘不染

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

mysql

当我尝试从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中
有一个页面讨论用于解决此问题的MySQL适配器的修补程序,但是它已过时,似乎不再起作用。

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

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

这是我正在使用的代码:

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

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


阅读 236

收藏
2020-05-17

共1个答案

一尘不染

将程序包装到函数中是否可行?如果由于没有返回行而导致Ruby的倒入(...can't return a result set in the given context...),则可以解决此问题:

分隔符$

创建过程tProc()
开始
    SET @a ='测试';
结束;
$

创建函数tFunc()
返回整数
开始
    呼叫tProc();
    返回1;
结束;
$

定界符;

从双重选择tFunc();
>> 1

从双重选择@a;
>>“测试”

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

后续:我在Ruby / ActiveRecord上相当不错,但是这个示例确实可以工作

ActiveRecord :: Base。Establishment_connection(authopts)

类TestClass <ActiveRecord :: Base
结束

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

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

2020-05-17