前言 对于新接触OracleDeveloper编程的同仁而言当完成的系统交给用户时经常性出现没有保存需要修改视图不可以更新之类的错误提示是非常尴尬的事 系统交付用户使用后用户一定会回馈一些BUG然而让用户重现BUG又是一件非常艰难的工作 面对这些问题解决的途径仍与其它开发工具一样就是错误处理的控制在其它语言中我们可以通过类似On Error Do xxx之类的语句来实现但是在FORMS中错误控制却往往令新进同仁头疼不已不知该在哪里屏蔽错误信息 本文对Forms的错误处理进行简单论述和应用并提供错误控制基本的程序包以解决新进同仁对困惑同时也抛砖引玉希望各同仁可以不断充实本文涉及的程序包和错误字典使之成为更加实用的共享代码 技术要点 复杂的问题仍是由最简单的方法来实现 错误处理相关触发器 FORMS的错误全部由On Error和On Message两个触发器来控制比较麻烦的是这两个触发器有时会一起触发有时又只触发一个 最好的办法就是将触发器的响应程序做得一个程序包在两个触发器中都进行控制 相关错误代码 在On Error触发器中一般使用Error_CodeError_TextError_Type系统变量错误代号/错误名称/错误类型 在On Message触发器中一般使用Message_CodeMessage_TextMessage_Type系统变量 如果是Oracle后台错误则通过DBMS_Error_Code和DBMS_Error_Text来获取相关信息 实现与功能 体系架构 创建字典表数据表和相关视图存储在屏蔽的错误信息此时程序的BUG信息仍可以<当然也可以不>显示于用户界面 创建错误日志数据表存储用户使用过程中的每一个错误信息该数据表可以为将来系统维护提供非常重要的支持 创建后台程序包对错误进行处理所谓处理在实例中是将错误信息写入错误日志并判断字典表确认该错误信息是否显示于用户界面 创建前台程序包对错误进行处理所谓处理在实例中只是调用后台程序包而已 所有相关文件及代码点击此处下载armokrar 创建数据库运行环境 ============================================================ Table: 错误日志数据表 ============================================================ create table SYSTEM_ERRORLOG ( SELKEYNUMBER() not null ISCONTROL CHAR() null SELCODE NUMBER() null SELTYPE VARCHAR()null SELTEXT VARCHAR()null SELMODULE VARCHAR()null SELBLOCKVARCHAR()null SELITEM VARCHAR()null ORACLECODENUMBER() null ORACLETEXTVARCHAR()null SQLTEXT VARCHAR()null SQLSTRVARCHAR()null SELLOGDATE null SELUSRNUMBER() null constraint PK_SYSTEM_ERRORLOG primary key (SELKEY) ) / ============================================================ Table: 字典表 ============================================================ create table SYSTEM_DICT ( DICTKEY number() not null DICTCLASS nvarchar() null DICTPROPnvarchar() null DICTCODEnvarchar() null DICTNAMEnvarchar() null UPCLASSKEYnumber() null MEMOnvarchar()null CRTUSRnumber() null CRTLOGdate null AMDUSRnumber() null AMDLOGdate null constraint PK_SYSTEM_DICT primary key (DICTKEY) ) / ============================================================ Table: 错误日志序列 ============================================================ 系统错误日志KEY用于生成系统错误日志的主键 CREATE SEQUENCE SQ_System_SelKey INCREMENT BY START WITH MAXVALUE E MINVALUE NOCYCLE CACHE NOORDER / ============================================================ Table: 要屏蔽的错误信息 ============================================================ Insert Into System_Dict (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) Values (ErrorMsgAppDict不能在此创建记录NullSysDateSysDate); Insert Into System_Dict (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) Values (ErrorMsgAppDict域被保护防止更新NullSysDateSysDate); Insert Into System_Dict (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) Values (ErrorMsgAppDict不能在视图插入或更新数据NullSysDateSysDate); Insert Into System_Dict (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) Values (ErrorMsgAppDict不能更新此记录NullSysDateSysDate); Insert Into System_Dict (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) Values (ErrorMsgAppDict没修改需要保存NullSysDateSysDate); Insert Into System_Dict (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) Values (ErrorMsgAppDict没有查询到记录NullSysDateSysDate); Insert Into System_Dict (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) Values (ErrorMsgAppDict在第一条记录NullSysDateSysDate); Insert Into System_Dict (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) Values (ErrorMsgAppDict已查询到最后一条记录NullSysDateSysDate); ============================================================ 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 : :: Purpose : 系统维护 登记前台系统的错误 Function FN_SystemErrorLog (P_SelCode Number P_SelType Varchar |