है समस्या FlameRobin पता करने के लिए जब एक बयान समाप्त होता है और अगले बयान शुरू होता है की जरूरत है। डिफ़ॉल्ट रूप से यह अर्धविराम (;
) का उपयोग करता है। हालांकि EXECUTE BLOCK
अनिवार्य रूप से संग्रहीत प्रक्रिया है जो डेटाबेस में संग्रहीत नहीं है, इसलिए इसमें पीएसक्यूएल कोड शामिल है जो अर्धविराम को कथन विभाजक के रूप में भी उपयोग करता है।
इसका परिणाम यह है कि आपको वाक्यविन्यास त्रुटियां मिलती हैं क्योंकि फ्लेमरोबिन सर्वर पर अपूर्ण कथन भेज रहा है (यानी: यह प्रत्येक ;
के बाद एक कथन भेज रहा है)।
आपको SET TERM
का उपयोग करके एक अलग कथन टर्मिनेटर का उपयोग करने के लिए FlameRobin को निर्देश देने की आवश्यकता है। अन्य फायरबर्ड क्वेरी टूल्स (जैसे आईएससीएल) को इसकी भी आवश्यकता होती है, लेकिन यह वास्तव में फ़ायरबर्ड के सिंटैक्स का हिस्सा नहीं है! ,
-- Instruct flamerobin to use # as the terminator
SET TERM #;
EXECUTE BLOCK
AS
DECLARE customerID INT = 1234;
BEGIN
SELECT * FROM customers WHERE customerid = :customerID;
END#
-- Restore terminator to ;
SET TERM ;#
हालांकि यह कर अभी भी त्रुटि में परिणाम होगा क्योंकि इस क्वेरी psql अमान्य है::
तो आप अपने कोड के रूप में निष्पादित करने के लिए जरूरत है एक psql ब्लॉक में एक SELECT
मैप करने के लिए एक INTO
खंड की आवश्यकता है चर के लिए कॉलम। और EXECUTE BLOCK
से बाहर मूल्यों को प्राप्त करने के लिए FlameRobin करने के लिए आप भी documentation of EXECUTE BLOCK
में वर्णित के रूप में एक RETURNS
खंड निर्दिष्ट करने की आवश्यकता लौटे:
-- Instruct flamerobin to use # as the terminator
SET TERM #;
EXECUTE BLOCK
RETURNS (col1 INTEGER, col2 VARCHAR(100))
AS
DECLARE customerID INT = 1234;
BEGIN
SELECT col1, col2 FROM customers WHERE customerid = :customerID INTO :col1, :col2;
SUSPEND;
END#
-- Restore terminator to ;
SET TERM ;#
जहां तक मैं जानता हूँ कि SUSPEND
तकनीकी रूप से यहां की आवश्यकता नहीं है, लेकिन Flamerobin नहीं होगा लौटाई गई पंक्ति को लाएं यदि इसमें शामिल नहीं है।
हालांकि उपरोक्त काम नहीं करेगा अगर चयन एकाधिक पंक्तियां उत्पन्न करता है। उसके लिए आपको FOR SELECT ... DO
एक SUSPEND
के साथ संयुक्त उपयोग करने की आवश्यकता:
-- Instruct flamerobin to use # as the terminator
SET TERM #;
EXECUTE BLOCK
RETURNS (col1 INTEGER, col2 VARCHAR(100))
AS
DECLARE customerID INT = 1234;
BEGIN
FOR SELECT col1, col2 FROM customers WHERE customerid = :customerID INTO :col1, :col2
DO
SUSPEND;
END#
-- Restore terminator to ;
SET TERM ;#
SUSPEND
यहाँ पंक्ति वापस आती है और इंतजार कर रहा है जब तक फोन करने वाले उस पंक्ति लाया था और उसके बाद FOR
पाश के साथ जारी है। इस तरह यह परिणाम पर फिर से शुरू होगा।
आईएमएचओ पैरामीटर के लिए यह बहुत अधिक प्रयास है। जब आप फ्लैमरोबिन का उपयोग करते हैं, तो आप पैरामीटर को सामान्य पैरामीटर प्लेसहोल्डर के लिए पैरामीटर मानों के लिए पूछने का समर्थन करने वाले टूल का उपयोग करने के लिए केवल पैरामीट्रिजिंग पर विचार करना चाहेंगे (लेकिन ईमानदार होने के लिए मुझे यकीन नहीं है कि कोई है या नहीं)।
आपके नमूने पूरी तरह से काम करते हैं। आपके प्रतिक्रिया के लिए धन्येवाद।यह वास्तव में इसे लागू करने के लिए बहुत अधिक प्रयास है, मुझे बहुत सारे प्रश्नों को बदलना होगा। लेकिन कम से कम मुझे पता है कि मैं गलत दरवाजे पर जान रहा हूं। –