【问题标题】:How to find out line number, procedure name in PL/SQL in case of an error发生错误时如何在 PL/SQL 中找出行号、过程名称
【发布时间】:2011-02-17 15:12:16
【问题描述】:

我正在使用 D2k 6i 表单并从存储数据库 (oracle9i) 过程 ORA-00001: 违反唯一约束 (.) 但我无法追踪它来自哪个过程。 任何人都可以帮助我解决这个问题

【问题讨论】:

    标签: oracle plsql unique-constraint ora-00001


    【解决方案1】:

    对于后代,这是 OP 找到的解决方案:

    好的,在 D2k 表单中,有一个 ON-ERROR 触发器,您可以在其中使用函数 DBMS_ERROR_TEXT 来获取过程、包名、错误来自的语句的行号

    【讨论】:

      【解决方案2】:

      经过大量研究、撞头和咬牙切齿,我发现了这种模式:

      CREATE OR REPLACE PACKAGE BODY my_schema.package_name
      IS
      
        PROCEDURE foo
        IS
        BEGIN
          -- Call stored procedures/functions that throw unhandled exceptions
        EXCEPTION
          WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('ERROR! - '
              || DBMS_UTILITY.FORMAT_ERROR_STACK
              || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
        END foo;
      
      END;
      

      DBMS_UTILITY.FORMAT_ERROR_STACK 函数似乎给出了错误代码和消息,DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 似乎给出了诚实的堆栈跟踪,至少在 Oracle 10g 中包含行号和存储过程名称。

      我不确定这些功能在 Oracle 9i 中是否可用。即使对于 Oracle 10g,我也找不到关于这类事情的太多信息,所以我想我至少会发布这个答案,因为 9i 已经很老了(所以它是 10g)。

      【讨论】:

        【解决方案3】:

        在您的问题中发布您的例外情况可以让我们更好地了解您所面临的问题。

        通常异常会告诉您错误消息中的包和行号。从中,您可以查询 USER_SOURCE 表:

        SELECT text 
        FROM user_source 
        WHERE type = 'PACKAGE BODY' 
          AND name = 'myProcName' 
          AND line = [the line number];
        

        了解更多有关触发错误的上下文可能会很有用。为此,您可以使用 `BETWEEN' 运算符:

        SELECT text 
        FROM user_source 
        WHERE type = 'PACKAGE BODY' 
          AND name = 'myProcName' 
          AND line BETWEEN [the line number - 5] AND [the line number +5];
        

        【讨论】:

        • 其实我是想知道出错的过程名和行号。你提供的查询只有在你知道过程名、包名的情况下才有用。
        • @bhagwat - 如果您找到了答案,请在此处发布。既是老师又是学生。
        • ok 在 D2k 表单中有一个 ON-ERROR 触发器,您可以在其中使用函数 DBMS_ERROR_TEXT 来获取过程,包名称来自哪里的语句的行号
        猜你喜欢
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多