2009-01-23 22 views
5

, bu durum almak: Bu sorunu gideren MySQL adaptörü için Rails Wiki that discusses a patch bir sayfa yokturRuby'den MySQL saklı yordamı çağırmak mümkün mü? Rails bir saklı yordam çağrısı çalıştığınızda

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 

ama dışarı güncel olduğunu ve gelmez Artık işe yaramıyor.

Yapılandırma kodu, saklı yordamları doğru bir şekilde etkinleştirir, ancak saklı yordam çağrısı sonrasında eşitleme bağlantısında sorun yaşanıyor ve yeni call_sp yöntemi artık çalışmıyor.

Bu çalışmayı nasıl alacağınız konusunda herhangi bir öneriniz var mı?

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

Aynı istisna atar storedproc() getiri olsun herhangi sonuçları ya da olmasın:

Bu

kullanıyorum kodudur.

cevap

1

Prosedürü bir işlevde sarmak işe yarar mı? Hiçbir satır nedeniyle Ruby'nin barfing (...can't return a result set in the given context...) iade ederse, bunu çözebilir:

 
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' 

, gerçekçi, bu çok genişletilebilir çözüm olmasa da.

İzleyen: Ben Ruby/ActiveRecord oldukça n00by değilim, ama bu örnek kesinlikle CALL tProc() sizinkine benzer bir hatayla sonuçlandı kullanma

 
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 

çalışır.

+0

Sizin örnek alıyorum, ama bizim saklı proc ile çalışır "HATA 1415 (0A000): bir işlev kümesi olan bir sonuca dönmek için izin verilmez". Onları yazan adamla konuşacağım ve örneğiniz gibi şeyler döndürmek için onları yeniden yazamayacağımızı göreceğim. – Otto

+1

Bu bizi ileriye taşıyor, ancak yine de değişkenlerde çalışmayacak çok fazla veriyi döndürmesi gereken birkaç prosedüre sahibiz. – Otto

+0

İleriye gittim ve kabul ettim, çünkü bu en iyi çözüm olarak görünüyor. Hala birçok veriyi iade etme sorunu var, ama birkaç gün oldu ve hiç kimse daha iyi bir şeyle karşılaşmadı. MySQL adaptörünü tamir etmeden var olduğunu sanmıyorum. – Otto

1

ActiveRecord :: Base.connection.execute kullanıyor musunuz? Bu yöntem, Active Record paketinde saf olarak desteklenmeyen bazı rasgele SQL deyimlerini çalıştırmanıza izin vermelidir.

+1

Kullanmakta olduğum şey bu özel durumla karşılaşıyorum. – Otto

İlgili konular