Eigentlich kann ich nicht jeder Aussage zustimmen.
"COALESCE erwartet, dass alle Argumente denselben Datentyp haben."
Das ist falsch, siehe unten. Argumente können unterschiedliche Datentypen sein, was auch dokumentiert ist : Wenn alle Vorkommen von expr ein numerischer Datentyp oder ein nicht numerischer Datentyp sind, der implizit in einen numerischen Datentyp konvertiert werden kann, bestimmt Oracle Database implizit das Argument mit der höchsten numerischen Priorität konvertiert die verbleibenden Argumente in diesen Datentyp und gibt diesen Datentyp zurück. . Tatsächlich steht dies sogar im Widerspruch zum allgemeinen Ausdruck "COALESCE stoppt beim ersten Auftreten eines Nicht-Null-Werts", andernfalls sollte Testfall Nr. 4 keinen Fehler auslösen.
Auch nach Testfall Nr. 5 COALESCE
erfolgt eine implizite Konvertierung von Argumenten.
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!