Aslında her bir ifadeyi kabul edemiyorum.
"COALESCE tüm argümanların aynı veri tipinde olmasını bekliyor."
Bu yanlış, aşağıya bakın. Bağımsız değişkenler farklı veri türleri olabilir, bu da belgelenir : Tüm ifade örnekleri sayısal veri türü veya örtük olarak sayısal veri türüne dönüştürülebilen herhangi bir sayısal olmayan veri türüyse, Oracle Database üst üste en yüksek sayısal önceliğe sahip bağımsız değişkeni belirler kalan bağımsız değişkenleri bu veri türüne dönüştürür ve bu veri türünü döndürür. . Aslında bu, yaygın ifade ile "COALESCE Null olmayan bir değerin ilk oluşması durumunda durur" ifadesine aykırıdır, aksi takdirde test durumu No. 4 hata vermemelidir.
Ayrıca test durumu No. 5'e COALESCE
göre argümanların örtük bir dönüşümü vardır.
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!