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'; -- 禁止顯示「正在處理...」類工作訊息
優點:一行代碼全域生效,無需逐個訊息處理。
缺點:
Forms 提供兩個關鍵觸發器:
ERROR_CODE, ERROR_TYPE, ERROR_TEXT)MESSAGE_CODE, MESSAGE_TYPE, MESSAGE_TEXT)-- 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;
FORM_MSG_MAP (ORA_CODE, FRM_CODE, CUSTOM_TEXT)。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 中文化 |
MESSAGE() 覆蓋。MESSAGE_LEVEL,否則看不到原始錯誌碼。屏蔽英文提示不是目的,**提供清晰、業務語境化的中文引導**才是核心價值。建議採用「觸發器攔截 + 訊息對照表」架構,一次建置,長期受惠,並為未來多語系擴展奠基。