In realtà non posso essere d'accordo su ogni affermazione.
"COALESCE si aspetta che tutti gli argomenti siano dello stesso tipo di dati."
Questo è sbagliato, vedere di seguito. Gli argomenti possono essere tipi di dati diversi, ovvero documented: Se tutte le occorrenze di expr sono di tipo numerico o qualsiasi tipo di dati non numerico che può essere convertito implicitamente in un tipo di dati numerico, Oracle Database determina l'argomento con la precedenza numerica massima, converte implicitamente gli argomenti rimanenti in quel tipo di dati e restituisce quel tipo di dati.. In realtà questo è anche in contraddizione con l'espressione comune "COALESCE si arresta al primo verificarsi di un valore non Null", altrimenti il caso di test n. 4 non dovrebbe generare un errore.
Anche secondo il caso di test n. 5 COALESCE
esegue una conversione implicita degli argomenti.
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!
fonte
2016-11-30 08:50:17
Maggiori informazioni qui: https://jonathanlewis.wordpress.com/2018/02/13/coalesce-v-nvl/ –