1 前言
對于新接觸OracleDeveloper編程的同仁而言,當完成的系統交給用戶時,經常性出現“沒有保存需要修改”,“視圖不可以更新”...之類的錯誤提示是非常尷尬的事。
系統交付用戶使用后,用戶一定會回饋一些BUG,然而讓用戶重現BUG又是一件非常艱難的工作。
面對這些問題,解決的途徑仍與其它開發工具一樣,就是錯誤處理的控制。在其它語言中,我們可以通過類似On Error Do xxx...之類的語句來實現,但是在FORMS中,錯誤控制卻往往令新進同仁頭疼不已,不知該在哪里屏蔽錯誤信息。
本文對Forms的錯誤處理進行簡單論述和應用,并提供錯誤控制基本的程序包,以解決新進同仁對困惑;同時也拋磚引玉,希望各同仁可以不斷充實本文涉及的程序包和錯誤字典,使之成為更加實用的共享代碼。
2 技術要點
復雜的問題,仍是由最簡單的方法來實現。
2.1 錯誤處理相關觸發器
FORMS的錯誤,全部由On Error和On Message兩個觸發器來控制,比較麻煩的是這兩個觸發器有時會一起觸發,有時又只觸發一個。
最好的辦法,就是將觸發器的響應程序做得一個程序包,在兩個觸發器中都進行控制。
2.2 相關錯誤代碼
在On Error觸發器中,一般使用Error_Code,Error_Text,Error_Type系統變量,錯誤代號/錯誤名稱/錯誤類型
在On Message觸發器中,一般使用Message_Code,Message_Text,Message_Type系統變量
假如是Oracle后臺錯誤,則通過DBMS_Error_Code和DBMS_Error_Text來獲取相關信息
3 實現與功能
3.1 體系架構
3.1.1 創建字典表數據表和相關視圖,存儲在屏蔽的錯誤信息,此時程序的BUG信息仍可以<當然也可以不>顯示于用戶界面
3.1.2 創建錯誤日志數據表,存儲用戶使用過程中的每一個錯誤信息,該數據表可以為將來系統維護提供非常重要的支持
3.1.3 創建后臺程序包,對錯誤進行處理。所謂“處理”,在實例中是將錯誤信息寫入錯誤日志,并判定字典表確認該錯誤信息是否顯示于用戶界面
3.1.4 創建前臺程序包,對錯誤進行處理。所謂“處理”,在實例中只是調用后臺程序包而已。
所有相關文件及代碼:點擊此處下載armok0199700.rar
3.2 創建數據庫運行環境
-- ============================================================
-- Table: 錯誤日志數據表
-- ============================================================
create table SYSTEM_ERRORLOG
(
SELKEY NUMBER(28) not null,
ISCONTROL CHAR(10) null ,
SELCODE NUMBER(28) null ,
SELTYPE VARCHAR2(100) null ,
SELTEXT VARCHAR2(200) null ,
SELMODULE VARCHAR2(100) null ,
SELBLOCK VARCHAR2(100) null ,
SELITEM VARCHAR2(100) null ,
ORACLECODE NUMBER(28) null ,
ORACLETEXT VARCHAR2(100) null ,
SQLTEXT VARCHAR2(500) null ,
SQLSTR VARCHAR2(500) null ,
SELLOG DATE null ,
SELUSR NUMBER(28) null ,
constraint PK_SYSTEM_ERRORLOG PRimary key (SELKEY)
)
/
-- ============================================================
-- Table: 字典表
-- ============================================================
create table SYSTEM_DICT
(
DICTKEY number(28) not null,
DICTCLASS nvarchar2(100) null ,
DICTPROP nvarchar2(100) null ,
DICTCODE nvarchar2(100) null ,
DICTNAME nvarchar2(100) null ,
UPCLASSKEY number(28) null ,
MEMO nvarchar2(1000) null ,
CRTUSR number(28) null ,
CRTLOG date null ,
AMDUSR number(28) null ,
AMDLOG date null ,
constraint PK_SYSTEM_DICT primary key (DICTKEY)
)
/
-- ============================================================
-- Table: 錯誤日志序列
-- ============================================================
--系統錯誤日志KEY,用于生成系統錯誤日志的主鍵
CREATE SEQUENCE SQ_System_SelKey INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER
/
-- ============================================================
-- Table: 要屏蔽的錯誤信息
-- ============================================================
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112001,'ErrorMsg','AppDict','41051','不能在此創建記錄',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112002,'ErrorMsg','AppDict','40200','域被保護防止更新',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112003,'ErrorMsg','AppDict','40602','不能在視圖插入或更新數據',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112004,'ErrorMsg','AppDict','41050','不能更新此記錄',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112005,'ErrorMsg','AppDict','40401','沒修改需要保存',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112006,'ErrorMsg','AppDict','40350','沒有查詢到記錄',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112007,'ErrorMsg','AppDict','40100','在第一條記錄',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112008,'ErrorMsg','AppDict','40352','已查詢到最后一條記錄',Null,SysDate,1,SysDate,1);
-- ============================================================
-- Table: 要屏蔽的錯誤信息清單視圖
-- ============================================================
Create Or Replace View VW_System_JumpMsg_Qry AS
Select
--創建字典視圖:要屏蔽的系統信息
DictKey
,DictClass
,DictProp
,DictCode
,DictName
From System_Dict
Where
Upper(DictClass)=Upper('ErrorMsg')
And Upper(DictProp)=Upper('AppDict')
Order By DictKey
/
-- ============================================================
-- Table:錯誤信息后臺程序包
-- ============================================================
create or replace package PKG_System_Assert is
-- Author : RUBYXUE
-- Created : 2004-4-11 12:59:44
-- Purpose : 系統維護
--登記前臺系統的錯誤
Function FN_SystemErrorLog
(P_SelCode Number
,P_SelType Varchar