2010-07-01 16 views
42

लगभग समान है, लेकिन वास्तव में उत्तर here का उत्तर नहीं दिया गया है।postgresql में स्थानीय चर घोषित कैसे करें?

मैं एमएस एसक्यूएल सर्वर से PostgreSQL में एक एप्लिकेशन माइग्रेट कर रहा हूं। कोड में कई स्थानों पर मैं स्थानीय चर का उपयोग करता हूं इसलिए मैं उस बदलाव के लिए जाना चाहूंगा जिसके लिए कम काम की आवश्यकता है, तो क्या आप कृपया मुझे बता सकते हैं कि निम्न कोड का अनुवाद करने का सबसे अच्छा तरीका कौन सा है?

-- MS SQL Syntax: declare 2 variables, assign value and return the sum of the two 
declare @One integer = 1 
declare @Two integer = 2 
select @One + @Two as SUM 

इस रिटर्न:

SUM 
----------- 
3 

(1 row(s) affected) 

मैं Postgresql 8.4 या यहां तक ​​कि 9.0 का उपयोग करेगा अगर यह महत्वपूर्ण fetaures कि अनुवाद को सरल बनाएगा शामिल हैं।

+0

यह पोस्ट मदद कर सकता है? http://stackoverflow.com/questions/36959/how-do-you-use-script-variables-in-postgresql – jheppinstall

+0

http://stackoverflow.com/questions/36959/how-do-you-use के समान संभावित -स्क्रिप्ट-चर-इन-पोस्टग्रेस्क्ल –

+0

ऐसा लगता है कि आपको 9.0 के लिए इंतजार करना है - ["DO - अज्ञात कोड ब्लॉक निष्पादित करें"] (http://developer.postgresql.org/pgdocs/postgres/sql-do.html)। –

उत्तर

61

पोस्टग्रेस्क्ल ऐतिहासिक रूप से कमांड स्तर पर प्रक्रियात्मक कोड का समर्थन नहीं करता - केवल कार्यों के भीतर। हालांकि, Postgresql 9 में, समर्थन execute an inline code block में जोड़ा गया है जो प्रभावी रूप से इस तरह का समर्थन करता है, हालांकि वाक्यविन्यास शायद थोड़ा अजीब है, और SQL सर्वर के साथ आप क्या कर सकते हैं इसकी तुलना में कई प्रतिबंध हैं। विशेष रूप से, इनलाइन कोड ब्लॉक परिणाम सेट वापस नहीं कर सकता है, इसलिए आप उपरोक्त रूपरेखा के लिए उपयोग नहीं किए जा सकते हैं।

सामान्य रूप से, यदि आप कुछ प्रक्रियात्मक कोड लिखना चाहते हैं और इसे परिणाम वापस लेना चाहते हैं, तो आपको इसे एक फ़ंक्शन के अंदर रखना होगा। उदाहरण के लिए:

CREATE OR REPLACE FUNCTION somefuncname() RETURNS int LANGUAGE plpgsql AS $$ 
DECLARE 
    one int; 
    two int; 
BEGIN 
    one := 1; 
    two := 2; 
    RETURN one + two; 
END 
$$; 
SELECT somefuncname(); 

PostgreSQL वायर प्रोटोकॉल नहीं, जहाँ तक मुझे पता है, कई परिणाम सेट लौटने के लिए एक कमांड जैसी चीजों के लिए अनुमति मिल जाएगी। तो आप पोस्टग्रेएसक्यूएल फ़ंक्शंस में टी-एसक्यूएल बैच या संग्रहीत प्रक्रियाओं को बस मैप नहीं कर सकते हैं।

+0

तार प्रोटोकॉल कई आदेशों की अनुमति देता है। और इस प्रकार कई अलग-अलग परिणाम सेट (एसिंक्रोनस मोड में)। – Jasen

+0

@ जेसन मैं विशेष रूप से उड़ान में कई क्वेरी-प्रतिक्रिया चक्र होने के बजाय एकाधिक परिणाम सेट/परिणाम गणनाओं को लौटने वाला एक प्रश्न पूछता हूं। यद्यपि यह स्थिति भी 2010 से बदल सकती है। – araqnid

+0

कार्य को कई कॉल के रूप में फिर से लिखना संभव हो सकता है। 'f1() से * चुनें; * f2() से चुनें; * f3() से चुनें * और इसलिए कई अलग-अलग परिणाम सेट प्राप्त करें। – Jasen

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