当我尝试从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方法不再起作用,仍然存在问题。
call_sp
关于如何使它工作的任何建议?
这是我正在使用的代码:
ActiveRecord::Base.connection("call storedproc()")
无论是否storedproc()返回任何结果,它都会引发相同的异常。
storedproc()
将程序包装到函数中是否可行?如果由于没有返回行而导致Ruby的倒入(...can't return a result set in the given context...),则可以解决此问题:
...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()导致与您类似的错误。
CALL tProc()