2009-01-23 40 views
5

当我打电话从Rails的存储过程,我得到这个异常:是否可以从Ruby调用MySQL存储过程?

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 that discusses a patch为MySQL适配器解决此问题的网页,但它是外的日期和没有按似乎再也无法工作了。

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

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

这是我使用的代码:

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

它抛出同样的异常任何结果是否storedproc()返回与否。

回答

1

它将工作包装在一个函数的过程?如果Ruby的,由于没有行barfing返回(...can't return a result set in the given context...),这可能会解决这个问题:

 
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' 

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

跟帖:我在红宝石/ ActiveRecord的漂亮n00by,但这个例子肯定工程

 
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 

使用CALL tProc()导致你类似的错误。

+0

你的榜样工作,但与我们的存储过程中,我得到“ERROR 1415(0A000):不准从函数返回的结果集”。我要和那些写他们的人谈谈,看看我们是否不能重写他们来回报你的例子。 – Otto 2009-01-23 15:41:08

+1

这让我们前进,但我们仍然有一些需要返回大量数据的proc,这些数据在变量中不起作用。 – Otto 2009-01-23 19:03:51

1

你在使用ActiveRecord :: Base.connection.execute吗?这种方法应该允许你执行一些任意的SQL语句,而这些语句在Active Record包装器中并没有被天真地支持。

相关问题