2010-01-07 19 views
7

क्या किसी को पता है, क्यों ओरेकल के NVL (और NVL2) फ़ंक्शन हमेशा दूसरे पैरामीटर का मूल्यांकन करता है, भले ही पहला पैरामीटर NULL न हो?एनवीएल हमेशा दूसरे पैरामीटर का मूल्यांकन क्यों करता है

सरल टेस्ट:

CREATE FUNCTION nvl_test RETURN NUMBER AS 
BEGIN 
    dbms_output.put_line('Called'); 
    RETURN 1; 
END nvl_test; 

SELECT NVL(0, nvl_test) FROM dual

रिटर्न 0, लेकिन यह भी Called प्रिंट करता है।

nvl_test कहा गया है, भले ही परिणाम को अनदेखा किया गया हो क्योंकि पहले पैरामीटर NULL नहीं है।

उत्तर

8

यह हमेशा ऐसा ही रहा है, इसलिए ओरेकल को पीछे की तरफ संगत रहने के लिए इसे इस तरह रखना है।

शॉर्ट-सर्किट व्यवहार प्राप्त करने के बजाय COALESCE का उपयोग करें।

+1

चेतावनी: यह 9i में शॉर्ट-सर्किट नहीं है। –

0

वे स्पष्ट रूप से शॉर्ट-सर्किटिंग नहीं हैं, लेकिन मुझे ओरेकल दस्तावेज़ों में कोई संदर्भ नहीं मिल रहा है।

इस चर्चा चेक आउट: http://forums.oracle.com/forums/thread.jspa?messageID=3478040

3

सामान्य में, यह, समारोह कॉल करने से पहले कि दूसरा पैरामीटर मूल्यांकन किया जाता है मतलब है, क्योंकि सामान्य है कि कैसे काम करता है कहा जाता है में: कार्य करने के लिए सभी तर्कों मूल्यांकन किया जाता है और मूल्यांकन मूल्य समारोह में भेजे जाते हैं।

हालांकि, एनवीएल जैसे बहुत ही सामान्य सिस्टम फ़ंक्शन के मामले में, मैंने सोचा होगा कि पीएल/एसक्यूएल एक विशेष मामले के रूप में फ़ंक्शन कॉल का इलाज कर सकता है। लेकिन शायद यह लगता है कि यह मेरे लिए अधिक कठिन है (मुझे), क्योंकि मुझे यकीन है कि ओरेकल के डेवलपर्स को यह अनुकूलन हुआ होगा।

5

यहां एक पोस्ट है जहां टॉम Kyte पुष्टि करता है कि decode और case शॉर्ट सर्किट लेकिन nvl नहीं है लेकिन वह औचित्य या दस्तावेज़ीकरण क्यों नहीं देता है। बस में कहा गया है यह हो:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:926029357278#14932880517348

तो आपके मामले में आप decode या case बजाय nvl का उपयोग करना चाहिए एक महंगी समारोह अपने प्रश्न में बुलाया जाएगा।

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