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

Oracle Forms 中文化提示雙重奏:訊息等級過濾與觸發器攔截替換

     編輯:Oracle 資料庫基礎

痛點:英文提示讓用戶抓狂

「FRM-40202: Field must be entered」、「FRM-40350: Query caused no records retrieved」—— 這類英文系統訊息在中文環境下嚴重影響使用體驗。Oracle Forms 提供兩種原生機制解決。

方案一:訊息等級過濾 —— 一鍵靜音低級噪音

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

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

效果:

  • 「記錄已儲存」、「查無資料」等資訊性訊息消失。
  • 核心錯誤(ORA-xxxxx、FRM-40xxx 等級>25)仍會顯示。

缺點:

  • 無法自訂訊息文案,只能「不顯示」。
  • 可能隱藏用戶確實需要的提示(如「刪除確認?」)。
  • 無法處理等級 > 25 的嚴重錯誤中文化。

方案二:觸發器攔截替換 —— 精準中文化、完全可控

兩大核心觸發器:

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

基礎範例:FRM-40202 中文化

-- ON-ERROR 觸發器
DECLARE
  v_code NUMBER := ERROR_CODE;
  v_type VARCHAR2(3) := ERROR_TYPE;
  v_text VARCHAR2(200) := ERROR_TEXT;
BEGIN
  IF v_code = 40202 AND v_type = 'FRM' THEN
    MESSAGE('欄位值必須輸入!');   -- 自訂中文
    BELL;                         -- 蜂鳴提醒
    RAISE FORM_TRIGGER_FAILURE;   -- 關鍵:阻止預設訊息顯示
  END IF;
END;

進階架構:訊息對照表 + 通用處理器

避免在觸發器寫死成百上千的 IF-ELSE。

  1. 建立對照表
CREATE TABLE form_msg_map (
  msg_type   VARCHAR2(3) NOT NULL,  -- 'FRM' 或 'ORA'
  msg_code   NUMBER      NOT NULL,
  custom_text VARCHAR2(500) NOT NULL,
  lang       VARCHAR2(5) DEFAULT 'ZH_TW',
  CONSTRAINT pk_form_msg_map PRIMARY KEY (msg_type, msg_code, lang)
);

-- 範例資料
INSERT INTO form_msg_map VALUES ('FRM', 40202, '欄位值必須輸入!', 'ZH_TW');
INSERT INTO form_msg_map VALUES ('FRM', 40350, '查詢無資料,請調整條件', 'ZH_TW');
INSERT INTO form_msg_map VALUES ('ORA', 00001, '資料重複,請檢查唯一鍵', 'ZH_TW');
COMMIT;
  1. 通用 ON-ERROR 處理器
DECLARE
  v_custom VARCHAR2(500);
BEGIN
  SELECT custom_text INTO v_custom
  FROM form_msg_map
  WHERE msg_type = ERROR_TYPE
    AND msg_code = ERROR_CODE
    AND lang = USERENV('LANG');  -- 或應用層傳入的語系參數

  IF v_custom IS NOT NULL THEN
    MESSAGE(v_custom);
    RAISE FORM_TRIGGER_FAILURE;
  END IF;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    NULL;  -- 無對照則走預設顯示
END;
  1. ON-MESSAGE 同理(攔截 MESSAGE_CODE/MESSAGE_TYPE/MESSAGE_TEXT)。

關鍵細節

  • RAISE FORM_TRIGGER_FAILURE 必須拋出,否則預設訊息仍會顯示在訊息列。
  • ERROR_TEXT/MESSAGE_TEXT **唯讀**,不可直接修改,必須用 MESSAGE() 覆蓋。
  • 觸發器中**嚴禁 DML/COMMIT**,避免遞迴錯誤或資料不一致。
  • 多語系擴展:對照表加 LANG 欄位,應用登入時設定 Session 語系參數。

混合策略:最佳實踐組合拳

層級手段處理訊息類型
全域MESSAGE_LEVEL=25 + SUPPRESS_WORKING=TRUE低級資訊噪音(處理中、查無資料等)
精準ON-ERROR / ON-MESSAGE + 對照表核心業務錯誤、關鍵確認提示(中文化)
審計觸發器中記錄 ERROR_CODE、用戶、時間到日誌表所有攔截訊息,事後分析高頻錯誤優化 UI

避坑指南

  1. 測試時關閉 MESSAGE_LEVEL,否則看不到原始錯誤代碼無法建立對照表。
  2. ON-MESSAGE 同樣需 RAISE FORM_TRIGGER_FAILURE 才能阻擋預設資訊訊息。
  3. 若使用 CALL_FORM/OPEN_FORM,子表單繼承父表單觸發器,**確認範圍**是否需在子表單重寫。
  4. WebForms (Forms Services) 環境下,BELL 可能無聲,改用 JavaScript alert() 或前端 Toast。

結語

中文化提示不是「把英文翻成中文」,而是**用業務語言引導用戶完成任務**。建議採用「全域過濾噪音 + 觸發器精準中文化 + 對照表可維護 + 審計日誌可優化」四位一體架構。一次建置,終身受益,並為未來多語系、無障礙存取奠基。

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