关于在PLSQL中实现DEBUG调试功能的方法
关于在PLSQL中实现DEBUG调试功能的方法
2017年04月07日 14:27:52 samt007 阅读数:2179 标签: oracle调试plsql 更多
个人分类: Oracle PL/SQL技巧
前言
一个健康的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=1的
PROCEDURE 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(+)');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
需要注意的是,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;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
完工!就是这么的简单,让您写的PLSQL就拥有了完整的而且有非常好扩展性的调试功能!
文档下载以及源代码下载的链接:
http://download.csdn.net/detail/samt007/9806450
https://blog.csdn.net/samt007/article/details/69537289
试玩了plsql中test窗口declare声明变量|lpad函数||plsql sql command test window区别|
在这里先感谢一下itpub高手的帖子答复
Q:
看到的oracle中的for循环or i in 1..100 loop,i都是从1,2,3这样递增的,可是我这里需要i从01,02,03这样递增,9开始是09,10,11,12.
请问这样的for循环怎么写。
具体问题可见http://www.itpub.net/thread-1620912-1-1.html,我想在触发器中加入循环变量,精简我的触发器长度。
ps:我是新手,谢谢大家的帮助
A:
lpad('tech', 7); would return ' tech'
lpad('tech', 2); would return 'te'
lpad('tech', 8, '0'); would return '0000tech'
lpad('tech on the net', 15, 'z'); would return 'tech on the net'
lpad('tech on the net', 16, 'z'); would return 'ztech on the net'
每次看到itpub的答复都很激动,一个恢复解决问题。
lpad函数说明
语法格式如下:
lpad( string, padded_length, [ pad_string ] )
string
准备被填充的字符串;
padded_length
填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;
pad_string
填充字符串,是个可选参数,这个字符串是要粘贴到string的左边,如果这个参数未写,lpad函数将会在string的左边粘贴空格。
下面说plsq中的块。
经常看到有人和书上直接写declare,也不在触发器或者存储过程中,可是照样使用,比如:http://zhidao.baidu.com/question/113921713.html
1,我刚开始直接在plsql中的查询窗口sql window使用,报错:
13:51更新:
sql windows窗口也是可以显示的,在第二列就是output,仅仅select不行
2,想到在测试窗口test window,通过(需要点击左上角的start debugger按钮,然后点击run)
-- Created on 2012-6-13 by DELL declare -- Local variables herei number; begin-- Test statements herefor i in 1..100 loopdbms_output.put_line(lpad(i,2,'0'));end loop; end;
下面是结果
拓展:
1 Command window实现了SQL*Plus的所有功能,允许运行sql*plus命令,sql命令,sql脚本。
2 SQL window用于执行sql语句,显示sql输出,执行统计信息。(测试sql语句,查看表中的数据,更新数据)
例如 desc table(查看表结构)不能在SQL window中执行,必须在Command window中才能执行。
3 Program window中创建一个存储过程(或者直接在plsql左边对应的procedures和trigger右键新建),如下:
create or replace procedure TEST is begin DBMS_SESSION.set_nls('NLS_DATE_FORMAT','''YYYY-MM-DD HH24:MI:SS'''); DBMS_OUTPUT.PUT_LINE('HelloWorld!'); DBMS_OUTPUT.put_line(SYSDATE); end TEST;
需要注意,SET_NLS的第二个参数VALUE
输入的值除了需要的格式外,还需要包含引号,否则会引发错误(选项缺失或无效)
在Command window中执行(或者在Test window中测试),如下:
set serveroutput on
exec TEST();
或者begin
2 test();
3 end;
4 / ......
分类: ORACLE
好文要顶 关注我 收藏该文
sumsen
关注 - 5
粉丝 - 21
+加关注
https://www.cnblogs.com/sumsen/archive/2012/06/13/2547512.html
关于在PLSQL中实现DEBUG调试功能的方法相关推荐
- 使用Eclipse开发Java Web过程中Debug调试的使用方法
这里介绍的是在Eclipse中的Debug调试. 首先右击项目选择Debug As -- Debug on Server 或者点击Server面板的小昆虫图标,启动Debug模式. 运行web项目,进 ...
- 解析idea中的debug调试模式
解析idea中的debug调试模式 1 含义 **测试出程序逻辑错误的神器,**妈妈再也不用担心我打印输出语句(sout)去进行测试程序的运行的逻辑了 2 作用 当程序很长时,便于去调试程序,用于检查 ...
- python生成shell脚本_Python设置在shell脚本中自动补全功能的方法
本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...
- idea调试怎么跳出循环_使用IDEA的Debug调试功能,查看程序的运行过程
Debug追踪,使用IDEA的断点调试功能,查看程序的运行过程 知乎视频www.zhihu.com 1. 在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序 ...
- 在W10系统下进行Debug调试功能
文章目录 前言 一.DOSBox.Debug的下载与安装 1.下载并安装DOSBox 2.下载Debug 3.配置DOSBox文件 4.运行DOSBox 二.汇编学习中常用到的Debug功能 前言 本 ...
- Mac Intrellij IDEA中使用debug调试
目录 一.Debug开篇 二.基本用法&快捷键 三.变量查看 四.计算表达式 五.智能步入 六.断点条件设置 七.多线程调试 八.回退断点 九.中断Debug 十.附:JRebel激活 Deb ...
- IDEA的debug调试功能
Idea的debug调试可以说是非常强大,只有你想不到,没有它做不到.Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数 ...
- Java-day12(面向对象中2 Debug 调试 方法的重写 多态性)
继承性练习一 Circle类: package com.acoffee.exer;public class Circle {private double radius;//半径public Circl ...
- 在vscode中怎样debug调试go程序
随着互联网时代的飞速发展,我们编码使用的开发利器也在不断更新换代,古话说工欲善其事必先利其器,对于Java开发者而言,eclipse和idea这两款神器各有千秋,因自己的爱好可以选取不同的IDE,但是 ...
- idea中HTML可以打debug吗,Intellij IDEA中使用Debug调试
virtual关键字的本质是什么? MSDN上对virtual方法的解释:试着翻译如下 当一个方法声明包含virtual修饰符,这个方法就是虚方法.如果没有virtual修饰符,那么就不是虚方法. 非 ...
最新文章
- matlab中的mkdir函数_科学网—Matlab中计算函数运行时间的三种方法及判断新建文件夹 - 张伟的博文...
- Windows 8测试版安装图组
- 解决Nginx出现403 forbidden (13: Permission denied)报错的四种方法
- 广西大学计算机专业研究生录取分数线,广西大学电子信息(专硕)专业考研录取分数线-研究生分数线-历年分数线...
- MySQL存储过程使用游标循环数据列表
- 笔记本启动与关闭自带键盘
- Date对象在Android和IOS上的兼容
- vmware + ubuntu + docker+ tensorflow
- excel打开csv乱码解决------------为什么pycharm里面csv不乱码,excel里面却乱码了
- 模拟信号的数字处理方法
- nmake、makefile、cmake学习笔记
- Python爬虫搜索全网音乐并下载
- 产品战略与战术之行业分析
- 小程序画布电子签名(实例)
- 推荐一个比较好用的画廊展示图片(支持无限轮播)的控件ViewPagerGallery
- IEEE754浮点数标准
- 一种打印机控制电路及打印机的制作方法
- 面向对象与面向过程理解
- Getting in Shape
- 二、八、十、十六进制之间的转换
热门文章
- git diffmerge tool 配置
- 基于SpringBoot实现简易的单点登录系统(提供gitee源码)
- php做教务系统管理,基于PHP-MYSQL技术的网络教务管理系统设计
- 计算机专业数学建模结课论文,数学建模结课论文3000字论文
- 从0到一开发微信小程序(4)—小程序组件
- python3 爬虫 urlretrieve
- Window: win10 点击打开此电脑中的磁盘时,提示找不到应用程序
- Java垃圾回收器详解
- 2022年信息安全工程师考试知识点:信息安全管理基础
- office在线编辑 html,Office在线编辑功能实现.doc