我正在寻找创建一个有助于调试特定变量的过程,为了重用性,我想将它存储在自己的过程中,并在需要时传递特定变量,例如
debugz(var_x);
并且调试过程将执行以下操作 -
PROCEDURE debugz (var_x VARCHAR2(1000))
AS
BEGIN
DBMS_OUTPUT.put_line ('Variable value: '|| var_x || ' | Line number: ' || $$plsql_line ||' | Unit: '|| $$plsql_unit);
END;
问题是,我希望PL / SQL行号和PL / SQL单元基于过程调用的起源,即“debugz(var_x);
”的行/单元。无论如何,debugz输出该行号而不传递其他信息吗?
答案 0 :(得分:5)
查看DBMS_UTILITY.FORMAT_CALL_STACK
您可能需要/想要根据您的具体要求解析输出,但可能是一个好的起点。
Oracle 10g以后。
另请注意DBMS_UTILITY.FORMAT_ERROR_BACKTRACE和DBMS_UTILITY.FORMAT_ERROR_STACK以进行错误处理。
答案 1 :(得分:0)
OWA_UTIL.WHO_CALLED_ME(
owner OUT VARCHAR2,
name OUT VARCHAR2,
lineno OUT NUMBER,
caller_t OUT VARCHAR2);
答案 2 :(得分:0)
有一个非常好的调试包单元,名为debugf,它提供了良好的功能
调试文件包含会话ID,日期和时间,被调用的包以及每个调试消息的行号和调试消息本身等信息
示例用法如下:
这用于初始化调试,第一个参数'ALL'表示所有模块(可以是函数,过程或包等),SYSTEM表示我想要调试的模式
debug.init(p_modules => 'ALL',p_file =>'C:\debugf123\temp\test.txt',p_user =>'SYSTEM',p_show_date => 'YES',p_date_format =>'DD/MM/YYYY HH24:MI:SS',p_name_len => 30,p_show_sesid => 'YES');
这个就像C中的printf一样,你可以给出的最大值是10个参数,其中v_word1是一个参数
debug.f('the first is %s',v_word1);
这与debug.f相同,但在这里你可以提供10个以上的参数
debug.fa('the third is %s and %s',debug.argv(v_word1,v_amount));
此软件包的源代码可在
获得答案 3 :(得分:0)
您是否尝试过远程调试?以下是在SQL Developer中执行此操作的方法:
1)参考: http://sueharper.blogspot.ca/2006/07/remote-debugging-with-sql-developer_13.html
2)用户权限: 将DBMS_DEBUG_JDWP上的EXECUTE授予USERXX; 将DEBUG CONNECT SESSION授予USERXX; 向USERXX授予调试任何程序;
3)在SQL Developer中的USERXX连接上设置远程调试: 端口:80(如果未被防火墙阻止,则使用4000) 本地地址:本地计算机的IP地址
4)在SQL Developer的USERXX中编译代码(包,过程或函数)以进行调试
5)在代码中设置断点
6)在遥控器上(这可能是你的应用程序调用PLSQL代码): 在调用PLSQL代码之前运行/包含以下内容: 运行此命令时,DBMS_DEBUG_JDWP.CONNECT_TCP('3中的IP地址,3中的端口)SQL开发人员将切换到调试模式。
7)从远程运行应用程序或调用过程作为USERXX
8)SQL开发人员在第一个断点处停止,单步执行,查看/更改值等等。