关于在PLSQL中实现DEBUG调试功能的方法

前言
一个健康的PLSQL,应该都带有一套完整的调试逻辑。特别是那些功能很复杂的PLSQL,就更加有必要具备调试功能了。否则,当PLSQL处理数据出现问题的时候,分析(处理)起来会相当的困难。
举个例子,Oracle EBS标准功能的PLSQL(特别是API),如果Oracle没有自带调试功能给我们做看每一步骤的调试结果,单单通过看代码模拟其执行逻辑来找问题,基本上是不可能处理问题的!
当然,我们编写的代码,实际上大部分的都并没有很复杂,所以对调试部分没太高的要求。这里也建议按照实际情况来做。但是一些重要的并且是复杂的功能,还是必须要考虑如何添加调试!
实现调试的办法
现在根据这几年写PLSQL的经验,得出的一套如何在PLSQL中实现调试的方法,特意分享一下。如果有更加好的方法,也可以一起讨论一下!

具体实现办法:
1 首先,统一新建3个客户化的Profile配置来实现调试功能的开关:
CUX:程序调试级别
设置调试的级别。这里是仿照标准功能的调试逻辑来做的一个设定。作用就是是否启用调试,以及调试的数据输出的明细级别!
具体:
XYG_ALD_DEBUG_LEVEL:设置查看调试消息的级别
0:不查看调试(默认值)
1:查看调试程序主要消息级别=1的消息
2:查看消息的调试级别<=2的信息
3:查看消息的调试级别<=3的信息
4:查看消息的调试级别<=4的信息
5:查看消息的调试级别<=5的信息

举个例子,如果我的调试消息设置是:调试级别3,调试显示3的信息。
则当XYG_ALD_DEBUG_LEVEL级别是2的时候,这个3的调试信息是不会显示的。
当XYG_ALD_DEBUG_LEVEL级别大于等于3的时候,这个消息才会显示出来!
具体可以自己写一个例子来理解。

CUX:程序调试方式
就是调试结果显示的方式。
一般来说有下面几种方式:
调试方式XYG_ALD_DEBUG_TYPE:
DBMS_OUTPUT直接输出
FILE_DEBUGLOG文档输出
REQUEST_DEBUGLOG请求日志输出
DATA_DEBUGLOG表格数据输出
DBMS_OUTPUT:这个不用多说了,实际上就是调用DBMS_OUTPUT.PUT_LINE在开发工具直接显示消息。
FILE_DEBUGLOG:这个很重要!不过要配合一些额外的定义,才可以看到这种输出的结果。这种方式的调试结果以文件的形式存在服务器里面。适合那种超大数据量输出的调试信息。
REQUEST_DEBUGLOG:如果PLSQL是在请求中调用的话,可以考虑用这种方式查看调试信息。调试信息会直接显示在请求的日志里面。
DATA_DEBUGLOG表格数据输出:就是将调试的结果输出在fnd_log_messages表。和标准功能的保持一致!

CUX:程序调试文件
结合调试方式= FILE_DEBUGLOG文档输出使用。
就是定义调试结果产生的文件是什么。
注意:如果这个设定为空,则默认文件= XYG_PUB_AUTOMAIL_PKG.XYG_DF_UTL_FILE_DIR||’/’||userenv(‘SESSIONID’)||’.log’

2 PLSQL里面如何使用调试的方法:
首先,在要添加调试逻辑的PKG包体里面,建议直接添加下面这些脚本,二次简单封装一下公用的调试处理包,方便调用:
例如:

CREATE OR REPLACE PACKAGE BODY APPS.XYG_ALBND_PACK_PKG
AS
   --===============================================================
   -- Debug 处理
   --===============================================================
   --P_DEBUG_LEVEL:该调试信息的级别
   PROCEDURE DEBUGLOG (P_DEBUG_LEVEL IN NUMBER,P_DEBUG_MSG IN VARCHAR2)
   IS
   BEGIN
      XYG_ALD_DEBUG_PKG.DEBUGLOG(' XYG_ALBND_PACK_PKG ',P_DEBUG_LEVEL,P_DEBUG_MSG);
   END DEBUGLOG;
   --简化版本,默认该消息的是level=1PROCEDURE DEBUGLOG1 (P_DEBUG_MSG IN VARCHAR2)
   IS
   BEGIN
      XYG_ALD_DEBUG_PKG.DEBUGLOG(' XYG_ALBND_PACK_PKG ',1,P_DEBUG_MSG);
   END DEBUGLOG1;
….
接着,在需要显示调试消息的地方,直接调用这个函数即可:
DEBUGLOG(1,'GENERATE_XXXXXXXXXXXXX(+)');   或者:DEBUGLOG1('GENERATE_XXXXXXXXXXXXX(+)');

需要注意的是,DEBUGLOG的第一个参数是该消息的显示级别。换句话说,就是你希望这个消息在什么级别显示它!
举个例子,如果设置为3,则消息基本是3级,当设置显示的消息级别大于等于3的时候,该消息会显示。

3 程序如何查看调试的结果:

------------------------------
---1 普通在Toad的output调试样例:
DECLARE
   L_RETCODE NUMBER;
   L_ERRBUF VARCHAR2(4000);
BEGIN
   FND_PROFILE.PUT('XYG_ALD_DEBUG_LEVEL',1);
   FND_PROFILE.PUT('XYG_ALD_DEBUG_TYPE','DBMS_OUTPUT');
   XYG_ALBND_PACK_PKG.AUTO_CREATE_PACK(
          'PO_HEADERS_ALL'
         ,2579287
         ,SYSDATE
         ,5954
         ,'NORMAL'
         ,l_retcode
         ,l_errbuf
       );
   DBMS_OUTPUT.PUT_LINE(L_RETCODE||'-'||L_ERRBUF);
END;

------------------------------
---2 调试结果文件输出样例:
DECLARE
   L_RETCODE NUMBER;
   L_ERRBUF VARCHAR2(4000);
BEGIN
   FND_PROFILE.PUT('XYG_ALD_DEBUG_LEVEL',2);
   FND_PROFILE.PUT('XYG_ALD_DEBUG_TYPE','FILE_DEBUGLOG');
   FND_PROFILE.PUT('XYG_ALD_DEBUG_FILE'
,'/oracle/vis/apps/apps_st/appl/attchment/12.0.0/BATCH_UPLOAD_TEMP/SAMT_TEST001.log');
   XYG_ALBND_PACK_PKG.AUTO_CREATE_PACK(
          'PO_HEADERS_ALL'
         ,2579287
         ,SYSDATE
         ,5954
         ,'NORMAL'
         ,l_retcode
         ,l_errbuf
       );
   DBMS_OUTPUT.PUT_LINE(L_RETCODE||'-'||L_ERRBUF);
END;

--查看文件的路径
SELECT FND_PROFILE.VALUE('XYG_ALD_DEBUG_FILE') FROM DUAL

------------------------------
--3 如果用数据输出的
DECLARE
   L_RETCODE NUMBER;
   L_ERRBUF VARCHAR2(4000);
BEGIN
   FND_PROFILE.PUT('XYG_ALD_DEBUG_LEVEL',2);
   FND_PROFILE.PUT('XYG_ALD_DEBUG_TYPE','DATA_DEBUGLOG');
   XYG_ALBND_PACK_PKG.AUTO_CREATE_PACK(
          'PO_HEADERS_ALL'
         ,2579287
         ,SYSDATE
         ,5954
         ,'NORMAL'
         ,l_retcode
         ,l_errbuf
       );
   DBMS_OUTPUT.PUT_LINE(L_RETCODE||'-'||L_ERRBUF);
END;
---查看调试信息:
select to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss:ff3') debug_time,session_id,module||'[---]'||message_text
  from fnd_log_messages
 where timestamp > sysdate-1
   and session_id=userenv('SESSIONID')
 order by LOG_SEQUENCE;

完工!就是这么的简单,让您写的PLSQL就拥有了完整的而且有非常好扩展性的调试功能!

文档下载以及源代码下载的链接:
http://download.csdn.net/detail/samt007/9806450

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值