FUNCTION chkA_B RETURN VARCHAR2 AS
a VARCHAR2(10) := NULL;
b VARCHAR2(10) := '1';
BEGIN
IF a = b THEN
RETURN 'Error';
END IF;
RETURN 'ok';
END;
預期回傳 'ok',實際在 9i 上追蹤發現:同時進入 RETURN 'Error' 並繼續執行 RETURN 'ok',最終回傳 'ok'。若改為 IF NVL(a,'0') = b THEN 則正常。
NULL = NULL、NULL = '1' 皆為 UNKNOWN(三值邏輯),非 TRUE 亦非 FALSE。IF UNKNOWN THEN 應視同 FALSE,不進入分支。但 9i 某版本編譯器對 IF a = b(其中一邊為變數、一邊為常數/變數)的短路評估有缺陷,導致條件判斷與後續流程控制異常。
NVL/COALESCE 處理 NULL:IF NVL(a,'#') = NVL(b,'#') THEN。IF a IS NOT NULL AND a = b THEN 明確語意。PLSQL_WARNINGS='ENABLE:ALL' 讓編譯器提示潛在邏輯問題。升級至 11g/12c/19c 可根治,若受限於舊版本,務必採用防禦性寫法。