ที่จริงฉันไม่สามารถเห็นด้วยกับแต่ละคำสั่ง
"COALESCE ต้องการให้อาร์กิวเมนต์ทั้งหมดเป็นประเภทข้อมูลเดียวกัน"
สิ่งนี้ผิดดูด้านล่าง อาร์กิวเมนต์อาจเป็นชนิดข้อมูลที่แตกต่างกันซึ่งมีการบันทึกไว้ด้วย : หากการเกิดขึ้นของ expr ทั้งหมดเป็นชนิดข้อมูลตัวเลขหรือชนิดข้อมูลที่ไม่ใช่ตัวเลขใด ๆ ที่สามารถแปลงเป็นชนิดข้อมูลตัวเลขโดยปริยาย Oracle Database จะกำหนดอาร์กิวเมนต์ด้วยลำดับความสำคัญสูงสุด แปลงอาร์กิวเมนต์ที่เหลือเป็นชนิดข้อมูลนั้นและส่งกลับชนิดข้อมูลนั้น. ที่จริงนี่คือแม้จะขัดแย้งกับนิพจน์ทั่วไป "COALESCE หยุดที่เกิดขึ้นครั้งแรกของค่าที่ไม่ใช่ค่า Null" มิฉะนั้นกรณีทดสอบหมายเลข 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!