मुझे एक SELECT कथन के भीतर उपयोगकर्ता द्वारा परिभाषित कार्यों का उपयोग करने के साथ कुछ दिलचस्प व्यवहार का अनुभव हो रहा है।ओरेकल में किसी क्वेरी में उपयोगकर्ता परिभाषित फ़ंक्शंस का मूल्यांकन कब किया जाता है?
मेरे पास कुछ संग्रहित प्रक्रियाएं हैं जो एक ही तालिका से डेटा को पढ़ और साफ़ करती हैं। इन संग्रहीत प्रक्रियाओं का उपयोग कई स्रोतों द्वारा किया जाता है।
मेरी टिप्पणियों में, ऐसा लगता है कि उपयोगकर्ता परिभाषित कार्यों कभी कभी मनमाने ढंग से, नहीं हमेशा तुरंत मूल्यांकन किया जाता है के बाद या। SELECT कथन का निष्पादन है कि यह प्रयोग किया जाता है
उदाहरण के लिए के दौरान, एक संग्रहीत प्रक्रिया में, मैं एक का चयन करें बयान कुछ इस तरह लग सकता है है:
SELECT Something, MyFunction(Something) FROM Somewhere;
यह एक और संग्रहीत प्रक्रिया के लिए एक कॉल, जो तालिका से डेटा को मिटा देता है द्वारा पीछा किया। शुद्ध डेटा की मात्रा किसी अन्य तालिका द्वारा शासित होती है, जो अधिकतम आईडी पढ़ती है। ऐसा इसलिए है कि एक शुद्ध को किसी भी डेटा को मिटाना नहीं चाहिए जिसे संग्रहीत प्रक्रिया निष्पादन के किसी अन्य उदाहरण द्वारा अभी तक नहीं पढ़ा गया है।
मेरे परीक्षण कोड में, MyFunction बस कहीं भी तालिका में पंक्तियों की संख्या देता है। इस प्रकार, मैं कल्पना करता हूं कि यह हमेशा पंक्तियों की संख्या के बराबर होना चाहिए जो SELECT कथन लौटाता है। हालांकि, ऐसे मामलों में जहां मैं इस संग्रहीत प्रक्रिया के दो उदाहरणों को चलाने में, मैं इस तरह के परिणाम कुछ पाने:
पहले क्वेरी उदाहरण:
Something MyFunction(Something)
--------- ---------------------
A 3
B 3
C 3
दूसरा क्वेरी उदाहरण:
Something MyFunction(Something)
--------- ---------------------
A 0
B 0
C 0
ऐसा क्यों है कि दूसरी क्वेरी सभी पंक्तियों को लौटाती है, लेकिन उपयोगकर्ता परिभाषित फ़ंक्शन जो उसी तालिका पर चलता है रिपोर्ट करता है कि तालिका में कोई और पंक्ति नहीं है?
क्या वैसे भी मैं यह सुनिश्चित कर सकता हूं कि दूसरा क्वेरी उदाहरण सुसंगत है कि उपयोगकर्ता परिभाषित फ़ंक्शंस अभी भी वही डेटा देखता है जो अभिभावक संग्रहीत प्रक्रिया देख रहा है?
मुझे समझ में नहीं आ रहा है: 2 कॉल के बीच y कहां टेबल शुद्ध करें? – Sebas
भ्रम के बारे में क्षमा करें। स्पष्टीकरण के लिए, एक संग्रहीत प्रक्रिया है जो (1) चयन कथन निष्पादित करती है, और (2) चयन कथन के बाद शुद्ध प्रक्रिया को कॉल करती है। – acee
मैं देखता हूं, इसलिए फ़ंक्शन सही परिणाम देता है ना? चयन नहीं करता है, या अलग-अलग कहा जाता है कि कोई पंक्ति वापस नहीं की जानी चाहिए। की पुष्टि? – Sebas