2009-01-23 42 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包裝器中並沒有被天真地支持。

相關問題