Oracle PL / SQL调试过程 - 使用$$ plsql_line

时间:2012-03-14 22:03:58

标签: sql oracle plsql toad

我正在寻找创建一个有助于调试特定变量的过程,为了重用性,我想将它存储在自己的过程中,并在需要时传递特定变量,例如

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输出该行号而不传递其他信息吗?

4 个答案:

答案 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)); 

此软件包的源代码可在

获得

http://gerardnico.com/wiki/database/oracle/debugf

答案 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开发人员在第一个断点处停止,单步执行,查看/更改值等等。