postgresql - भूल गए असाइनमेंट ऑपरेटर "=" और आम जगह ":="




plpgsql assignment-operator (3)

पीएल / पीजीएसक्यूएल के लिए प्रलेखन कहता है, कि चर के लिए घोषणा और असाइनमेंट किया गया है := । लेकिन एक सरल, छोटा और अधिक आधुनिक (फुटनोट देखें) = उम्मीद के अनुसार काम करता है:

    CREATE OR REPLACE FUNCTION foo() RETURNS int AS $$
    DECLARE
      i int;
    BEGIN
      i = 0;  
      WHILE NOT i = 25 LOOP
          i = i + 1;
          i = i * i;
      END LOOP;
      RETURN i;
    END;
    $$ LANGUAGE plpgsql;

    > SELECT foo();
    25

कृपया ध्यान दें, कि Pl / pgSQL लाइन में दिखाए गए अनुसार असाइनमेंट और तुलना को स्पष्ट रूप से अलग कर सकता है

      WHILE NOT i = 25 LOOP

तो, सवाल हैं:

  • क्या मुझे दस्तावेज़ों में कुछ अनुभाग नहीं मिला जो इसका उल्लेख करते हैं और / या समझाते हैं?
  • क्या इसके बजाय किसी भी ज्ञात परिणाम हैं := ?

संपादित / फुटनोट:

एक संक्षिप्त, अपूर्ण, और अधिकतर प्रोग्रामिंग भाषाओं के गलत इतिहास जैसे विंक के साथ "अधिक आधुनिक" भाग लें:

1 9 70 - निकलॉस विर्थ पास्कल, एक प्रक्रियात्मक भाषा बनाता है। आलोचकों ने तुरंत पास्कल को निंदा किया क्योंकि यह अधिक परिचित सी-जैसे "x = x + y" के बजाय "x: = x + y" वाक्यविन्यास का उपयोग करता है। इस आलोचना के बावजूद यह आलोचना होती है कि सी का अभी तक आविष्कार नहीं हुआ है।

1 9 72 - डेनिस रिची ने एक शक्तिशाली बंदूक का आविष्कार किया जो एक साथ आगे और पीछे दोनों को गोली मारता है। उस आविष्कार से मौतों की संख्या और स्थायी मैमिंग से संतुष्ट नहीं है, वह सी और यूनिक्स का आविष्कार करता है।


Q1

अंत में पोस्टग्रेस 9.4 के साथ आधिकारिक दस्तावेज में इसे जोड़ा गया है:

पीएल / पीजीएसक्यूएल वैरिएबल के लिए मूल्य का असाइनमेंट इस प्रकार लिखा गया है:

variable { := | = } expression;

[...] पीएल / एसक्यूएल-अनुपालन के बजाय समान ( = ) का उपयोग किया जा सकता है :=

Q2

क्या इसके बजाय किसी भी ज्ञात परिणाम हैं := ?

हां , मेरे पास गंभीर परिणामों के साथ मामला था: नामित पैरामीटर के साथ फ़ंक्शन कॉल - जो संबंधित है लेकिन बिल्कुल वही चीज़ नहीं है।

कड़ाई से बोलते हुए, इस मामले में भेद एसक्यूएल कोड में बनाया गया है। लेकिन यह असुरक्षित प्रोग्रामर के लिए एक अकादमिक भेदभाव है। 1

समारोह पर विचार करें:

CREATE FUNCTION f_oracle(is_true boolean = TRUE) -- correct use of "="
  RETURNS text AS
$func$
SELECT CASE $1
         WHEN TRUE  THEN 'That''s true.'
         WHEN FALSE THEN 'That''s false.'
         ELSE 'How should I know?'
       END
$func$ LANGUAGE sql;

इसके अलावा: फ़ंक्शन परिभाषा में = (सही) उपयोग = को नोट करें। यह एक एसक्यूएल असाइनमेंट है। 2

नामित नोटेशन के साथ फंक्शन कॉल:

SELECT * FROM f_oracle(is_true := TRUE);

पोस्टग्रेर्स पहचानता है := पैरामीटर असाइनमेंट के रूप में और सब ठीक है। तथापि:

SELECT * FROM f_oracle(is_true = TRUE);

चूंकि = एसक्यूएल समानता ऑपरेटर है, पोस्टग्रेस कॉलिंग स्टेटमेंट के संदर्भ में is_true = TRUE अभिव्यक्ति के रूप में is_true = TRUE अर्थ है और परिणाम को अज्ञात स्थितित्मक पैरामीटर के रूप में पास करने से पहले इसका मूल्यांकन करने का प्रयास करता है। यह बाह्य दायरे में पहचानकर्ता is_true की तलाश करता है। यदि वह नहीं मिला है:

ERROR:  column "is_true" does not exist

यह भाग्यशाली मामला है और सौभाग्य से, आम भी है।

जब बाहरी क्षेत्र में is_true = TRUE पाया जा सकता है, is_true = TRUE एक boolean परिणाम के साथ एक मान्य अभिव्यक्ति है जिसे फ़ंक्शन द्वारा स्वीकार किया जाता है। कोई त्रुटि नहीं होती है। जाहिर है, एसक्यूएल समानता ऑपरेटर = का उपयोग कर प्रोग्रामर का यह इरादा है ...

यह एसक्यूएल फिडल प्रभाव का प्रदर्शन करता है।

यदि आप = और := बीच भेद से अनजान हैं तो डीबग करना बहुत मुश्किल है।
हमेशा सही ऑपरेटर का उपयोग करें।

1 फ़ंक्शन कॉल में नामित नोटेशन का उपयोग करते समय , केवल := सही असाइनमेंट ऑपरेटर है। यह सभी भाषाओं के कार्यों पर लागू होता है, न केवल पीएल / पीजीएसक्यूएल, जिसमें पीजी 9.4 तक और शामिल है। निचे देखो।

2 फ़ंक्शन पैरामीटर के लिए डिफ़ॉल्ट मानों को परिभाषित करने के लिए कोई = (या DEFAULT ) का उपयोग कर सकता है। यह किसी भी तरह से समस्या से संबंधित नहीं है। यह गलत उपयोग मामले के करीब उल्लेखनीय है।

पोस्टग्रेस 9.0 - 9.4: से संक्रमण := से =>

नामित फ़ंक्शन पैरामीटर के असाइनमेंट के लिए SQL मानक => (और ओरेकल का पीएल / एसक्यूएल इसका उपयोग करता है । पोस्टग्रेर्स ऐसा नहीं कर सका क्योंकि ऑपरेटर पहले अनारक्षित था, इसलिए यह पीएल / पीजीएसक्यूएल के असाइनमेंट ऑपरेटर का उपयोग कर रहा है := इसके बजाय। पोस्टग्रेस 9.0 की रिलीज => अन्य उद्देश्यों के लिए => का उपयोग बहिष्कृत कर दिया गया है। प्रति रिलीज नोट्स :

ऑपरेटर नाम के रूप में => का अपमानजनक उपयोग (रॉबर्ट हास)

नामित फ़ंक्शन पैरामीटर के लिए SQL-मानक नोटेशन का समर्थन करने के लिए PostgreSQL के भविष्य संस्करण शायद इस ऑपरेटर नाम को पूरी तरह से अस्वीकार कर देंगे। इस पल के लिए, यह अभी भी अनुमति है, लेकिन जब एक ऑपरेटर परिभाषित किया जाता है तो एक चेतावनी उत्सर्जित होती है।

यदि आपको किसी और चीज़ के लिए => का उपयोग करना चाहिए, तो बंद करो और उतरें। यह भविष्य में टूट जाएगा।

पोस्टग्रेस 9.5: अब => उपयोग करें

इस रिलीज से शुरू, एसक्यूएल मानक ऑपरेटर => का उपयोग किया जाता है। := पिछड़ा संगतता के लिए अभी भी समर्थित है। लेकिन नए ऑपरेटर में मानक ऑपरेटर का उपयोग करें जिसे पुराने संस्करणों पर चलाने की आवश्यकता नहीं है।

महत्वपूर्ण नोट: यह केवल फ़ंक्शन कॉल (एसक्यूएल स्कोप) में नामित पैरामीटर असाइनमेंट पर लागू होता है, असाइनमेंट ऑपरेटर के लिए नहीं := plpgsql कोड में, जो अपरिवर्तित बनी हुई है।


Postgresql 9 प्रलेखन पढ़ना:

यह पृष्ठ ऑपरेटर प्राथमिकता पर तालिका में असाइनमेंट ऑपरेटर के रूप में "=" सूचीबद्ध करता है।

लेकिन आश्चर्यजनक रूप से यह पृष्ठ (असाइनमेंट ऑपरेटर दस्तावेज) इसका उल्लेख नहीं करता है।


मेरे अपने प्रश्न का आंशिक उत्तर:

पीएल / पीजीएसक्यूएल अनुभाग परिणाम स्थिति प्राप्त करने से एक विशेष वाक्यविन्यास का उपयोग करके दो उदाहरण दिखाए जाते हैं:

GET DIAGNOSTICS variable = item [ , ... ]; 
GET DIAGNOSTICS integer_var = ROW_COUNT;

मैंने दोनों की कोशिश की := और = और वे दोनों काम करते हैं।

लेकिन GET DIAGNOSTICS विशेष वाक्यविन्यास है, इसलिए कोई तर्क दे सकता है कि यह सामान्य पीएल / पीजीएसक्यूएल असाइनमेंट ऑपरेशन भी नहीं है।





assignment-operator