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

Oracle Forms 兩招屏蔽英文提示:訊息等級過濾與觸發器中文化

     編輯:Oracle 資料庫基礎

背景

Oracle Forms 預設顯示英文系統訊息(如 "FRM-40202: Field must be entered"),對非英文用戶不友好。本文介紹兩種原生方式實現中文化或屏蔽。

方法一:設定訊息等級過濾 —— 簡單但有限

Forms 將訊息分為 6 個嚴重等級(0, 5, 10, 15, 20, 25),數字越大越嚴重。開發者可壓縮的最高等級為 25。

-- 在表單啟動觸發器(WHEN-NEW-FORM-INSTANCE)中設定
:SYSTEM.MESSAGE_LEVEL := '25';        -- 只顯示等級 > 25 的訊息(實際上無此等級,等於全屏蔽可壓縮訊息)
:SYSTEM.SUPPRESS_WORKING := 'TRUE';   -- 禁止顯示「正在處理...」類工作訊息

優點:一行代碼全域生效,無需逐個訊息處理。
缺點:

  • 無法屏蔽等級 > 25 的核心錯誤(如資料庫錯誤 ORA-xxxxx)。
  • 無法自訂訊息內容,只能「不顯示」。
  • 可能隱藏用戶確實需要的提示(如「記錄已儲存」)。

方法二:攔截觸發器實現中文化 —— 靈活且完整

Forms 提供兩個關鍵觸發器:

  • ON-ERROR:攔截錯誤訊息(ERROR_CODE, ERROR_TYPE, ERROR_TEXT)
  • ON-MESSAGE:攔截資訊性訊息(MESSAGE_CODE, MESSAGE_TYPE, MESSAGE_TEXT)

實作範例:將 FRM-40202 中文化

-- ON-ERROR 觸發器
DECLARE
  v_err_code  NUMBER := ERROR_CODE;
  v_err_type  VARCHAR2(3) := ERROR_TYPE;
  v_err_text  VARCHAR2(200) := ERROR_TEXT;
BEGIN
  IF v_err_code = 40202 AND v_err_type = 'FRM' THEN
    MESSAGE('欄位值必須輸入!');  -- 自訂中文提示
    BELL;                        -- 蜂鳴器提醒
    RAISE FORM_TRIGGER_FAILURE;  -- 阻止預設錯誤顯示
  ELSE
    -- 其他錯誤保持預設行為(可選:記錄日誌後再 RAISE)
    NULL;
  END IF;
END;

進階:建立訊息對照表實現批量中文化

  1. 建立對照表 FORM_MSG_MAP (ORA_CODE, FRM_CODE, CUSTOM_TEXT)。
  2. 在 ON-ERROR/ON-MESSAGE 觸發器中查表替換:
SELECT custom_text INTO v_msg
FROM form_msg_map
WHERE (ora_code = ERROR_CODE AND error_type = 'ORA')
   OR (frm_code = ERROR_CODE AND error_type = 'FRM');

IF v_msg IS NOT NULL THEN
  MESSAGE(v_msg);
  RAISE FORM_TRIGGER_FAILURE;
END IF;

優點:可維護性高,非技術人員可透過表單維護訊息文案。
注意:RAISE FORM_TRIGGER_FAILURE 會中斷當前觸發器鏈,確保預設訊息不顯示。

兩種方法的選擇建議

場景推薦方法
快速原型、內部工具、可接受部分鍵訊息方法一(等級過濾)
正式產品、多語系需求、需精確控制每句話術方法二(觸發器攔截+對照表)
混合策略全域設 MESSAGE_LEVEL=25 過濾噪音,關鍵錯誤用 ON-ERROR 中文化

常見坑點提醒

  • 不要在 ON-ERROR 中執行 DML:可能導致遞迴錯誤或資料不一致。
  • ERROR_TEXT 只讀:無法直接修改,必須用 MESSAGE() 覆蓋。
  • ON-MESSAGE 同樣需 RAISE FORM_TRIGGER_FAILURE 才能阻擋預設資訊訊息。
  • 測試時記得關閉 MESSAGE_LEVEL,否則看不到原始錯誌碼。

結語

屏蔽英文提示不是目的,**提供清晰、業務語境化的中文引導**才是核心價值。建議採用「觸發器攔截 + 訊息對照表」架構,一次建置,長期受惠,並為未來多語系擴展奠基。

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