Thật ra tôi không thể đồng ý với từng tuyên bố.
"COALESCE hy vọng tất cả các đối số sẽ có cùng kiểu dữ liệu."
Điều này là sai, xem bên dưới. Các đối số có thể là các loại dữ liệu khác nhau, cũng được ghi lại : Nếu tất cả các lần xuất hiện của expr là loại dữ liệu số hoặc bất kỳ loại dữ liệu không có số liệu nào có thể được chuyển đổi thành loại dữ liệu số, thì Cơ sở dữ liệu Oracle sẽ xác định đối số có mức ưu tiên số cao nhất, mặc nhiên chuyển đổi các đối số còn lại thành kiểu dữ liệu đó và trả về kiểu dữ liệu đó. . Trên thực tế, điều này thậm chí còn mâu thuẫn với biểu thức chung "COALESCE dừng ở lần xuất hiện đầu tiên của giá trị không Null", nếu không, trường hợp thử nghiệm số 4 không nên gây ra lỗi.
Cũng theo trường hợp thử nghiệm số 5 COALESCE
, một chuyển đổi ngầm định của các đối số.
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!