2009-01-23 17 views
5

जब मैं रेल से एक संग्रहीत प्रक्रिया कॉल करने के लिए प्रयास करते हैं, मैं इस अपवाद:क्या रुबी से एक 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 

MySQL एडाप्टर है कि इस समस्या का समाधान के लिए Rails Wiki that discusses a patch में एक पृष्ठ नहीं है, लेकिन इसे बाहर पुरानी है और नहीं करता है अब काम नहीं कर रहा है।

कॉन्फ़िगरेशन कोड संग्रहीत प्रक्रियाओं को सही ढंग से सक्षम करता है, लेकिन संग्रहीत प्रक्रिया कॉल के बाद कनेक्शन को सिंक से बाहर होने के साथ अभी भी समस्या है और नई call_sp विधि अब और काम नहीं करती है।

इस काम को कैसे प्राप्त करें के लिए कोई सुझाव?

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

यह वही अपवाद फेंकता है कि क्या storedproc() रिटर्न किसी भी परिणाम या नहीं:

इस कोड मैं का उपयोग कर रहा है।

उत्तर

1

क्या यह किसी फ़ंक्शन में प्रक्रिया को लपेटने के लिए काम करेगा? यदि कोई भी पंक्ति की वजह से रूबी के 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

आपका उदाहरण काम करता है, लेकिन हमारे संग्रहीत proc के साथ मैं "त्रुटि 1415 (0A000): एक परिणाम के एक समारोह से सेट वापस जाने के लिए अनुमति नहीं"। मैं उस व्यक्ति से बात करने जा रहा हूं जिसने उन्हें लिखा है और देखें कि क्या हम उन्हें आपके उदाहरण की तरह चीजों को वापस करने के लिए फिर से लिख नहीं सकते हैं। – Otto

+1

यह हमें आगे बढ़ाता है, लेकिन हमारे पास अभी भी कुछ प्रोसेस हैं जिन्हें बहुत सारे डेटा वापस करने की आवश्यकता है जो चर में काम नहीं करेंगे। – Otto

+0

मैं आगे बढ़ गया और स्वीकार कर लिया, क्योंकि यह सबसे अच्छा वर्तमान समाधान प्रतीत होता है। अभी भी बहुत सारे डेटा लौटने का मुद्दा है, लेकिन यह कुछ दिन हो गया है और कोई भी बेहतर कुछ नहीं आया है। मुझे नहीं लगता कि यह MySQL एडाप्टर को ठीक किए बिना मौजूद है। – Otto

1

क्या आप ActiveRecord :: Base.connection.execute का उपयोग कर रहे हैं? इस विधि से आपको कुछ मनमानी SQL कथन निष्पादित करने की अनुमति मिलनी चाहिए जो सक्रिय रिकॉर्ड रैपर में समर्थित नहीं है।

+1

यही वह है जिसका मैं उपयोग कर रहा हूं, और मुझे वह अपवाद मिलता है। – Otto

2

मैंने रेल 2.3.4 पर एक पैच सबमिट किया है जो इस समस्या को ठीक करने के लिए कॉन्फ़िगरेशन विकल्प देता है। कृपया मेरे टिकट से रुकें और इसके लिए अपना समर्थन दिखाएं!

https://rails.lighthouseapp.com/projects/8994/tickets/3151-mysql-adapter-update-to-enable-use-of-stored-procedures

संबंधित मुद्दे

 संबंधित मुद्दे