मैं IMMUTABLE, VOLATILE और STABLE फ़ंक्शन की परिभाषाओं में सही अर्थ के बारे में स्पष्ट नहीं हूं।
मैं प्रलेखन पढ़ता हूं, विशेष रूप से प्रत्येक की परिभाषाएं।
IMMUTABLE इंगित करता है कि फ़ंक्शन डेटाबेस को संशोधित नहीं कर सकता है और समान तर्क मान दिए जाने पर हमेशा वही परिणाम देता है ; अर्थात्, यह डेटाबेस लुकअप नहीं करता है या अन्यथा इसकी तर्क सूची में सीधे मौजूद जानकारी का उपयोग नहीं करता है। यदि यह विकल्प दिया जाता है, तो सभी-निरंतर तर्कों वाले फ़ंक्शन के किसी भी कॉल को तुरंत फ़ंक्शन मान के साथ बदल दिया जा सकता है।
स्थिर इंगित करता है कि फ़ंक्शन डेटाबेस को संशोधित नहीं कर सकता है, और यह कि एक एकल टेबल स्कैन के भीतर यह उसी तर्क मानों के लिए लगातार परिणाम देगा , लेकिन इसका परिणाम SQL बयानों में बदल सकता है। यह उन कार्यों के लिए उपयुक्त चयन है, जिनके परिणाम डेटाबेस लुकअप, पैरामीटर चर (जैसे वर्तमान समय क्षेत्र), आदि पर निर्भर करते हैं (यह AFTER ट्रिगर्स के लिए अनुचित है जो वर्तमान कमांड द्वारा संशोधित पंक्तियों को क्वेरी करना चाहते हैं।) यह भी ध्यान दें। फ़ंक्शंस के current_timestamp परिवार स्थिर के रूप में अर्हता प्राप्त करते हैं, क्योंकि उनके मूल्य लेन-देन के भीतर नहीं बदलते हैं।
VOLATILE इंगित करता है कि फ़ंक्शन मान एकल तालिका स्कैन के भीतर भी बदल सकता है, इसलिए कोई अनुकूलन नहीं किया जा सकता है। इस अर्थ में अपेक्षाकृत कुछ डेटाबेस फ़ंक्शंस अस्थिर हैं; कुछ उदाहरण यादृच्छिक (), वक्रता (), समयावधि () हैं। लेकिन ध्यान दें कि किसी भी फ़ंक्शन के साइड-इफेक्ट्स को अस्थिर किया जाना चाहिए, भले ही इसका परिणाम काफी अनुमानित हो, कॉल को अनुकूलित होने से रोकने के लिए; एक उदाहरण है सेवल ()।
मेरा भ्रम IMMUTABLE और STABLE के लिए इस स्थिति के साथ आता है कि फ़ंक्शन ALWAYS या CONSISTENTLY उसी परिणाम देता है जो समान तर्क देता है।
IMMUTABLE परिभाषा बताती है कि फ़ंक्शन डेटाबेस लुकअप नहीं करता है या अन्यथा इसकी तर्क सूची में मौजूद जानकारी का सीधे उपयोग नहीं करता है। तो, मेरे लिए, इसका मतलब है कि इस तरह के कार्यों का उपयोग क्लाइंट द्वारा प्रदान किए गए डेटा में हेरफेर करने के लिए किया जाता है, और इसमें सेलेक्ट स्टेटमेंट नहीं होना चाहिए ... हालांकि यह मेरे लिए थोड़ा अजीब लगता है।
STABLE के साथ, परिभाषा समान है कि यह कहता है कि इसे लगातार उसी परिणाम को वापस करना चाहिए। तो, मेरे लिए, इसका मतलब है कि हर बार फ़ंक्शन को एक ही तर्कों के साथ कहा जाता है, इसे उसी परिणाम (समान सटीक पंक्तियों, हर एक समय) को वापस करना चाहिए।
तो, मेरे लिए ... इसका मतलब है कि कोई भी फ़ंक्शन जो किसी तालिका या तालिकाओं पर एक चयन करता है जिसे अपडेट किया जा सकता है, केवल अस्थिर होना चाहिए।
लेकिन, फिर से ... यह मेरे लिए सही नहीं लगता।
अपने उपयोग-मामले में इसे वापस लाते हुए, मैं ऐसे फ़ंक्शन लिख रहा हूं, जो कई JOIN के साथ चयन कथन निष्पादित करते हैं, जिन्हें लगातार जोड़ा जा रहा है, इसलिए फ़ंक्शन कॉल से अलग-अलग परिणामों की वापसी की उम्मीद की जाएगी जब भी यह कहा जाता है, तब भी। ।
तो, क्या इसका मतलब यह है कि मेरे कार्य VOLATILE होने चाहिए? भले ही दस्तावेज़ीकरण अपेक्षाकृत कुछ डेटाबेस कार्यों को इंगित करता है इस अर्थ में अस्थिर हैं ?
धन्यवाद!