首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 服务器>数据库应用>文章内容
简化PL/SQL调试的记录一致性错误日志
来源:http://www.unix5.com/ 作者:riechelr_hl 发布时间:2007-08-25  

从事Oracle数据库方面的工作已有一年有余了,我最喜欢的部分是PL/SQL。这是Oracle的数据可编程语言,使用它可以将过程化代码与SQL代码结合在一起。

最令人喜欢的是我们可以使用它在一个地方开发整个应用。所有的数据选择和更新,所有与LDAP交互的HTTP和HTML输出,以及其它所有事情都可以使用一种语言在一个地方完成。

但是其缺点是应用程序十分复杂。因为PL/SQL代码中的一个特定过程或函数可能要完成上面诸多任务中的任何一个,这样当出现问题时,调试查找错误变得十分困难。

这是数据库的问题,还是使用LDAP时HTTP的问题?问题在哪里?在每个PL/SQL项目中我喜欢使用一种简单的错误日志记录机制,这样当出现问题时,我有一个可以查看的简单数据表来跟踪所有错误。

我通过构建一个日志数据表开始介绍:

CREATE TABLE ERRORLOG

(

IDNUMBERNOT NULL,

TIMEDATENOT NULL,

CODEVARCHAR2(9 BYTE)NOT NULL,

MESSAGEVARCHAR2(2000 BYTE)NOT NULL,

PACKAGE_NAMEVARCHAR2(100 BYTE),

PROCEDURE_NAMEVARCHAR2(100 BYTE)NOT NULL,

LOCATIONNUMBER,

PARAMETERSVARCHAR2(4000 BYTE)

);

与其它大多数数据库不同,Oracle中没有内置的用于对ID自动增加的字段域。所以,我们需要创建一个序列,然后添加某些机制实现在一个新值插入时赋予一个序列值。下面是我们的序列:

CREATE SEQUENCE ERRORLOG_ID_SEQ

MINVALUE 1

MAXVALUE 999999999999999999999999999

INCREMENT BY 1

START WITH 1

CACHE 20

NOORDER

NOCYCLE ;

我们可以使用触发器插入时间戳,我们稍后会在提供日志接口的包中实现。该触发器完成的操作是利用我们上面创建的序列递增ID域。

CREATE OR REPLACE TRIGGER T_ERRORLOG_BI

BEFORE INSERT

ON ERRORLOG

REFERENCING OLD AS OLD NEW AS NEW

FOR EACH ROW

begin

if :new.id is null then

select errorlog_id_seq.nextval

into :new.id

from dual;

end if;

end t_errorlog_bi;

在实际应用中对数据表提供一个主键是十分有益的。我知道我们可以在创建表格时设定主键,但是我喜欢以后单独完成这项工作。我不知道为什么,只是感觉这样做更清楚一些。

ALTER TABLE ERRORLOG ADD (PRIMARY KEY (ID));

PL/SQL是基于古老的Ada程序设计语言的,因此在创建一个包时,需要提供两部分:规格说明(接口)部分和主体部分接口的真正实现。对于我们简单的错误日志记录包,规格说明部分只提供一个单一过程:

CREATE OR REPLACE package pkg_error is

procedure log (p_error_code errorlog.code%type,

p_error_message errorlog.message%type,

p_package errorlog.package_name%type default null,

p_procedure errorlog.procedure_name%type,

p_location errorlog.location%type default null,

p_parameters errorlog.parameters%type default null);

end pkg_error;

在主体部分,可以包含任意多个你想要的过程和函数。至少,它必须实现规格说明中的过程和函数。在本例中,包的主体部分只实现规格说明中的一个过程:

CREATE OR REPLACE package body pkg_error is

procedure log (p_error_code errorlog.code%type,

p_error_message errorlog.message%type,

p_package errorlog.package_name%type default null,

p_procedure errorlog.procedure_name%type,

p_location errorlog.location%type default null,

p_parameters errorlog.parameters%type default null) is

pragma autonomous_transaction;

begin

insert

into errorlog

共2页: 上一页 1 [2] 下一页
 

如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·在Linux x86上安装Oracle数据库1
·Linux系统下的Oracle数据库编程
·Linux下免费数据库PostgreSQL开
·如何在你的Linux机器上安装运行O
·Oracle开发应用
·PostgreSQL的热备和恢复
·Heartbeat_2.0.3配置MySQL5.0.18
·编制一个Mysql数据库自动备份脚
·mysql 优化参数(十项)详解设置
·MySQL数据库系统的常规管理介绍
·新手入门--全面介绍MySQL的基础
·让PHP网站运转如飞 MySQL 的优化
  相关文章
·Oracle PL/SQL编程风格与系统性
·VMWare上Oracle 10g R2的最简安
·在Linux x86上安装Oracle数据库1
·在slackware 10下安装Oracle 10
·在UnixWare7.1.1上安装Oracle8i
·Oracle开发应用
·Linux系统下Mini SQL数据库开发
·Linux系统下的Oracle数据库编程
·如何用"MySQL-Proxy"实现读写分
·怎样测试MyISAM引擎和Heap引擎执
·分布式数据库全局名与数据库链讲
·PostgreSQL的热备和恢复

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!