2013-10-10 6 views
5

मैं Firebird (जो मैं FlameRobin का उपयोग करके चलाए) में एक बड़े प्रश्न हैं, हर जगह एक पैरामीटर का उपयोग कर, लेकिन नीचे दिए गए क्वेरी हो रही हो जाएगा चलाने के लिए:चर को परिभाषित करें और निष्पादित का उपयोग कर क्वेरी चलाने ब्लॉक

SELECT * FROM customers WHERE customerid = 1234; 

मैं 1234 को एक चर के रूप में परिभाषित करना चाहता हूं, customerID कहें, ताकि मैं इसे आसानी से किसी अन्य चीज़ से बदल सकूं।

मैंने सीखा है कि मुझे इसे EXECUTE BLOCK के अंदर रखना होगा।

EXECUTE BLOCK 
AS 
DECLARE customerID INT = 1234; 

BEGIN 
    SELECT * FROM customers WHERE customerid = :customerID 
END 

किसी भी महत्व के हैं, तो त्रुटि मैं हो रही है Engine Message : Dynamic SQL Error SQL error code = -104 Unexpected end of command - line 3, column 26

उत्तर

10

है समस्या 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 पाश के साथ जारी है। इस तरह यह परिणाम पर फिर से शुरू होगा।

आईएमएचओ पैरामीटर के लिए यह बहुत अधिक प्रयास है। जब आप फ्लैमरोबिन का उपयोग करते हैं, तो आप पैरामीटर को सामान्य पैरामीटर प्लेसहोल्डर के लिए पैरामीटर मानों के लिए पूछने का समर्थन करने वाले टूल का उपयोग करने के लिए केवल पैरामीट्रिजिंग पर विचार करना चाहेंगे (लेकिन ईमानदार होने के लिए मुझे यकीन नहीं है कि कोई है या नहीं)।

+0

आपके नमूने पूरी तरह से काम करते हैं। आपके प्रतिक्रिया के लिए धन्येवाद।यह वास्तव में इसे लागू करने के लिए बहुत अधिक प्रयास है, मुझे बहुत सारे प्रश्नों को बदलना होगा। लेकिन कम से कम मुझे पता है कि मैं गलत दरवाजे पर जान रहा हूं। –

-2
SET TERM #; 
EXECUTE BLOCK 
RETURNS (COL1 Varchar(5) , COL2 INTEGER , COL3 INTEGER) 
AS 
DECLARE customerID INT = 5; 
BEGIN 
    FOR SELECT COSP.OSP_COMPON,COSP.OSP_DIAS FROM COSP WHERE COSP.OSP_ORDEM=2 INTO COL1 , COL3 
    DO 
    FOR SELECT CMES.MESNUM FROM CMES WHERE CMES.MESNUM = customerID INTO COL2 DO SUSPEND; 
    SUSPEND; 
END# 
SET TERM ;# 

क्यों गिरावट से?

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