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

Oracle Forms 中文化訊息兩大絕招:抑制系統訊息與攔截轉換錯誤代碼

     編輯:Oracle 資料庫基礎

前言

Oracle Forms 預設顯示英文系統訊息,對中文用戶不友善。本文介紹兩種實用的中文化方案:一是調整訊息層級抑制低優先級系統訊息,二是攔截 ON-ERROR/ON-MESSAGE 觸發器將特定錯誤代碼轉換為中文提示,並附完整代碼範例。

方案一:壓縮系統訊息,抑制資訊列顯示

Oracle Forms 訊息嚴重性層級 (0-25)

層級說明
0所有訊息
5重申明顯條件、操作員程序錯誤、嘗試非設計動作、觸發器問題、可能導致任務失敗的條件
25開發人員無法壓縮的關鍵訊息 (最高可壓縮層級)

實作代碼 (放於表單啟動觸發器 WHEN-NEW-FORM-INSTANCE)

:SYSTEM.MESSAGE_LEVEL := '25';
:SYSTEM.SUPPRESS_WORKING := 'TRUE';

效果

  • 抑制嚴重性 ≤ 25 的系統訊息顯示於訊息列
  • 抑制「正在處理...」等工作狀態訊息
  • 限制:無法抑制嚴重性 > 25 的關鍵錯誤訊息 (如 FRM-40202 欄位必填)

方案二:攔截系統訊息,轉換為中文提示

兩大關鍵觸發器

  • ON-ERROR:攔截系統錯誤訊息 (FRM-XXXXX)
  • ON-MESSAGE:攔截系統通知訊息 (資訊性提示)

實作範例:將 FRM-40202 轉為中文

-- 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 錯誤代碼中文化對照表

錯誤代碼英文原文建議中文
FRM-40202Field must be entered欄位值必須鍵入!
FRM-40201Record has been updated by another user記錄已被其他用戶修改,請重新查詢!
FRM-40401Unique constraint violated違反唯一性約束,資料重複!
FRM-40505ORA-xxxxx: ...資料庫錯誤:請聯繫管理員
FRM-40735ON-INSERT trigger raised unhandled exception新增觸發器發生未處理異常
FRM-41830List of Values is empty選單值為空,請檢查設定

ON-MESSAGE 觸發器範例:轉換資訊性訊息

-- 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;

注意事項與最佳實務

  1. 選擇性轉換:僅轉換高頻、用戶困惑的訊息,保留技術性錯誤原文供除錯
  2. RAISE FORM_TRIGGER_FAILURE:必須包含,否則原訊息仍會顯示
  3. 多語系擴展:對照表加入 LANG 欄位,依用戶語言偏好動態切換
  4. 測試覆蓋:建立自動化測試腳本觸發各錯誤代碼驗證中文化效果
  5. 版本升級:新版 Forms 可能新增錯誤代碼,需定期同步對照表

結語

Oracle Forms 中文化訊息的核心策略是:抑制雜訊 (MESSAGE_LEVEL/SUPPRESS_WORKING) + 精準轉換關鍵錯誤 (ON-ERROR/ON-MESSAGE)。方案一解決 80% 的資訊列干擾,方案二解決 20% 關鍵阻斷性錯誤的用戶理解障礙。建議建立專案級訊息對照表,納入版控與發布流程,實現可維護、可擴展的多語系支援。

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