首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle PL/SQL 詭異案例:NULL 比較導致 IF 分支同時執行?

     編輯:Oracle 資料庫基礎

現象重現

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 則正常。

根因分析

  • Oracle 中 NULL = NULL、NULL = '1' 皆為 UNKNOWN(三值邏輯),非 TRUE 亦非 FALSE。
  • IF UNKNOWN THEN 應視同 FALSE,不進入分支。但 9i 某版本編譯器對 IF a = b(其中一邊為變數、一邊為常數/變數)的短路評估有缺陷,導致條件判斷與後續流程控制異常。
  • 此為 9i 特定版本 Bug(可能與 PL/SQL 編譯器優化有關),10g 後已修復。

防禦性寫法建議

  1. 比較前統一 NVL/COALESCE 處理 NULL:IF NVL(a,'#') = NVL(b,'#') THEN。
  2. 或改用 IF a IS NOT NULL AND a = b THEN 明確語意。
  3. 開啟 PLSQL_WARNINGS='ENABLE:ALL' 讓編譯器提示潛在邏輯問題。

升級至 11g/12c/19c 可根治,若受限於舊版本,務必採用防禦性寫法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved