【问题标题】:Oracle PL/SQL debug procedure - using $$plsql_lineOracle PL/SQL 调试过程 - 使用 $$plsql_line
【发布时间】:2012-03-31 10:41:43
【问题描述】:

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

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 是否可以在不传递其他信息的情况下输出该行号?

【问题讨论】:

    标签: sql oracle plsql toad


    【解决方案1】:

    查看 DBMS_UTILITY.FORMAT_CALL_STACK

    您可能需要/想要根据您的确切要求解析输出,但可能是一个不错的起点。

    Oracle 10g 以上。

    还要注意 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 和 DBMS_UTILITY.FORMAT_ERROR_STACK 以进行错误处理。

    【讨论】:

    • 谢谢,如果没有更简单的显示,我可能最终会使用它。虽然从它返回的砖块中解析出行号可能有点痛苦。
    • 其实很容易解析。我经常这样做是为了调试。你甚至可以绑定到源代码来做一些漂亮的事情——比如促进轻量级测试脚本。搜索 Tom Kyte 的 who_call_me 函数以获取入门示例。
    • @llayland 感谢您的提示,我查看了该功能,它非常强大。我可能会使用 REGEXP 解析出一些较小的信息,但如果遇到问题,我可以使用该函数作为参考。
    【解决方案2】:

    有一个非常好的调试包单元,叫做 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】:
      OWA_UTIL.WHO_CALLED_ME(
         owner          OUT      VARCHAR2,
         name           OUT      VARCHAR2,
         lineno         OUT      NUMBER,
         caller_t       OUT      VARCHAR2);
      

      【讨论】:

        【解决方案4】:

        您尝试过远程调试吗?在 SQL Developer 中,您可以这样做:

        1) 参考: http://sueharper.blogspot.ca/2006/07/remote-debugging-with-sql-developer_13.html

        2) 用户权限: 将 DBMS_DEBUG_JDWP 上的 EXECUTE 授予 USERXX; 将调试连接会话授予 USERXX; 将 DEBUG ANY PROCEDURE 授予 USERXX;

        3) 在 SQL Developer 中对 USERXX 连接设置远程调试: 端口:80(如果没有被防火墙阻止,使用 4000) 本地地址:本地机器的 IP 地址

        4) 在 SQL Developer 中编译 USERXX 中的代码(包、过程或函数)进行调试

        5) 在代码中设置断点

        6) 在遥控器上(这可能是您的应用程序调用 PLSQL 代码): 在调用 PLSQL 代码之前运行/包括以下内容: DBMS_DEBUG_JDWP.CONNECT_TCP( 'IP address in 3', port in 3 ) 运行时 SQL 开发人员将切换到调试模式。

        7) 以 USERXX 身份从远程运行应用程序或调用过程

        8) SQL 开发人员在第一个断点处停止、单步执行、查看/更改值等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-13
          • 2016-09-28
          • 1970-01-01
          • 2014-06-09
          • 2022-01-18
          相关资源
          最近更新 更多