Oracle Forms 預設顯示英文系統訊息,對中文用戶不友善。本文介紹兩種實用的中文化方案:一是調整訊息層級抑制低優先級系統訊息,二是攔截 ON-ERROR/ON-MESSAGE 觸發器將特定錯誤代碼轉換為中文提示,並附完整代碼範例。
| 層級 | 說明 |
|---|---|
| 0 | 所有訊息 |
| 5 | 重申明顯條件、操作員程序錯誤、嘗試非設計動作、觸發器問題、可能導致任務失敗的條件 |
| 25 | 開發人員無法壓縮的關鍵訊息 (最高可壓縮層級) |
:SYSTEM.MESSAGE_LEVEL := '25';
:SYSTEM.SUPPRESS_WORKING := 'TRUE';
-- ON-ERROR 觸發器
DECLARE
v_err_code NUMBER := ERROR_CODE;
v_err_type VARCHAR2(10) := ERROR_TYPE;
v_err_text VARCHAR2(200) := ERROR_TEXT;
BEGIN
-- 針對特定錯誤代碼轉換
IF v_err_code = 40202 AND v_err_type = 'FRM' THEN
MESSAGE('欄位值必須鍵入!');
RAISE FORM_TRIGGER_FAILURE; -- 阻止預設錯誤處理
ELSIF v_err_code = 40201 AND v_err_type = 'FRM' THEN
MESSAGE('記錄已被其他用戶修改,請重新查詢!');
RAISE FORM_TRIGGER_FAILURE;
ELSIF v_err_code = 40401 AND v_err_type = 'FRM' THEN
MESSAGE('無法儲存:違反唯一性約束!');
RAISE FORM_TRIGGER_FAILURE;
ELSE
-- 其他錯誤保持預設行為 (顯示原文)
NULL;
END IF;
EXCEPTION
WHEN FORM_TRIGGER_FAILURE THEN
RAISE;
WHEN OTHERS THEN
MESSAGE('系統錯誤:' || v_err_text);
RAISE FORM_TRIGGER_FAILURE;
END;
| 錯誤代碼 | 英文原文 | 建議中文 |
|---|---|---|
| FRM-40202 | Field must be entered | 欄位值必須鍵入! |
| FRM-40201 | Record has been updated by another user | 記錄已被其他用戶修改,請重新查詢! |
| FRM-40401 | Unique constraint violated | 違反唯一性約束,資料重複! |
| FRM-40505 | ORA-xxxxx: ... | 資料庫錯誤:請聯繫管理員 |
| FRM-40735 | ON-INSERT trigger raised unhandled exception | 新增觸發器發生未處理異常 |
| FRM-41830 | List of Values is empty | 選單值為空,請檢查設定 |
-- ON-MESSAGE 觸發器
DECLARE
v_msg_type VARCHAR2(10) := MESSAGE_TYPE;
v_msg_code NUMBER := MESSAGE_CODE;
v_msg_text VARCHAR2(200) := MESSAGE_TEXT;
BEGIN
IF v_msg_type = 'FRM' AND v_msg_code = 40301 THEN
-- "Query caused no records to be retrieved"
MESSAGE('查無資料,請修改查詢條件!');
ELSIF v_msg_type = 'FRM' AND v_msg_code = 40350 THEN
-- "Query will retrieve all records"
MESSAGE('將查詢所有記錄,確定繼續嗎?');
ELSE
NULL; -- 保持預設
END IF;
END;
-- 建立訊息對照表
CREATE TABLE forms_msg_map (
err_type VARCHAR2(10),
err_code NUMBER,
zh_message VARCHAR2(500),
PRIMARY KEY (err_type, err_code)
);
-- ON-ERROR 通用處理
DECLARE
v_zh_msg VARCHAR2(500);
BEGIN
SELECT zh_message INTO v_zh_msg
FROM forms_msg_map
WHERE err_type = ERROR_TYPE AND err_code = ERROR_CODE;
MESSAGE(v_zh_msg);
RAISE FORM_TRIGGER_FAILURE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL; -- 無對照則用預設
WHEN OTHERS THEN
MESSAGE('系統異常:' || ERROR_TEXT);
RAISE FORM_TRIGGER_FAILURE;
END;
Oracle Forms 中文化訊息的核心策略是:抑制雜訊 (MESSAGE_LEVEL/SUPPRESS_WORKING) + 精準轉換關鍵錯誤 (ON-ERROR/ON-MESSAGE)。方案一解決 80% 的資訊列干擾,方案二解決 20% 關鍵阻斷性錯誤的用戶理解障礙。建議建立專案級訊息對照表,納入版控與發布流程,實現可維護、可擴展的多語系支援。