वास्तव में मैं प्रत्येक कथन से सहमत नहीं हो सकता।
"COALESCE को सभी तर्क समान डेटाटाइप के होने की उम्मीद है।"
यह गलत है, नीचे देखें। तर्क अलग-अलग डेटा प्रकार हो सकते हैं, जो कि प्रलेखित भी है : यदि expr की सभी घटनाएँ संख्यात्मक डेटा प्रकार या कोई भी गैर-डेटा डेटा प्रकार हैं, जिन्हें कथित रूप से एक संख्यात्मक डेटा प्रकार में परिवर्तित किया जा सकता है, तो Oracle डेटाबेस तर्क को उच्चतम संख्यात्मक वरीयता के साथ निर्धारित करता है, संक्षेप में शेष तर्कों को उस डेटा प्रकार में परिवर्तित करता है, और उस डेटा प्रकार को वापस करता है। । वास्तव में यह सामान्य अभिव्यक्ति के विपरीत भी है "COALESCE एक गैर-अशक्त मूल्य की पहली घटना पर रुकता है", अन्यथा परीक्षण संख्या 4 में एक त्रुटि नहीं उठानी चाहिए।
इसके अलावा परीक्षण के मामले में नंबर 5 COALESCE
तर्कों का एक अंतर्निहित रूपांतरण करता है।
DECLARE
int_val INTEGER := 1;
string_val VARCHAR2(10) := 'foo';
BEGIN
BEGIN
DBMS_OUTPUT.PUT_LINE( '1. NVL(int_val,string_val) -> '|| NVL(int_val,string_val) );
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('1. NVL(int_val,string_val) -> '||SQLERRM );
END;
BEGIN
DBMS_OUTPUT.PUT_LINE( '2. NVL(string_val, int_val) -> '|| NVL(string_val, int_val) );
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('2. NVL(string_val, int_val) -> '||SQLERRM );
END;
BEGIN
DBMS_OUTPUT.PUT_LINE( '3. COALESCE(int_val,string_val) -> '|| COALESCE(int_val,string_val) );
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('3. COALESCE(int_val,string_val) -> '||SQLERRM );
END;
BEGIN
DBMS_OUTPUT.PUT_LINE( '4. COALESCE(string_val, int_val) -> '|| COALESCE(string_val, int_val) );
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('4. COALESCE(string_val, int_val) -> '||SQLERRM );
END;
DBMS_OUTPUT.PUT_LINE( '5. COALESCE(SYSDATE,SYSTIMESTAMP) -> '|| COALESCE(SYSDATE,SYSTIMESTAMP) );
END;
Output:
1. NVL(int_val,string_val) -> ORA-06502: PL/SQL: numeric or value error: character to number conversion error
2. NVL(string_val, int_val) -> foo
3. COALESCE(int_val,string_val) -> 1
4. COALESCE(string_val, int_val) -> ORA-06502: PL/SQL: numeric or value error: character to number conversion error
5. COALESCE(SYSDATE,SYSTIMESTAMP) -> 2016-11-30 09:55:55.000000 +1:0 --> This is a TIMESTAMP value, not a DATE value!