【问题标题】:Oracle pl/sql code line(row) to variableOracle pl/sql 代码行(行)到变量
【发布时间】:2013-12-09 12:37:13
【问题描述】:

那么是否可以获取当前代码行?

1,2,3,4 v_variable :=(get_line or something???) and in variable are value 4?
5,6,7,8,9 v_variable :=(get_line or something???) and in variable are value 9?

我只想找到最简单的方法来捕捉错误 谢谢。

1,2,3,4, code lines...

【问题讨论】:

  • find easiest way to catch bugs 您需要详细说明您的情况。你想捕捉什么样的错误,在什么情况下。如果您不隐藏引发异常的行号,通过在异常部分调用raiseraise_application_error() 函数重新引发它,oracle 将为您提供准确的行号。
  • 当其他人 raise_application_error(-20001, l_cur_cl||SQLERRM) 就是这样,因为并非总是 oracle 提供行号...

标签: oracle plsql


【解决方案1】:

那么是否可以获取当前代码行?

是的,这是可能的。从 Oracle 10g 开始,$$PLSQL_LINE 查询指令可用于返回代码中出现$$PLSQL_LINE 的行号:

SQL> declare
  2    l_cur_cl pls_integer;
  3  begin
  4    l_cur_cl := $$PLSQL_LINE;
  5    dbms_output.put_line('Line #: '|| to_char(l_cur_cl) || chr(13)
  6                         || 'Current line #:  '|| to_char($$PLSQL_LINE));
  7  end;
  8  /

输出:

Line #: 4
Current line #:  6
PL/SQL procedure successfully completed

【讨论】:

  • 这是否需要他在每行之后打印/存储行号以帮助他跟踪错误?
  • @Adarsh 为了以后能够使用该行号,是的,它需要将指令的结果存储在一个变量中。但是这种方法不是异常跟踪的好选择(如果这是 OP 的最终目标)。您要么必须将 $$PLSQL_LINE 放在可能在同一行或上一行引发异常的语句之前。
【解决方案2】:

oracle 异常处理系统可帮助您完成所需的工作。您可以引发和处理用户定义的异常或系统异常,而不是手动获取行号,并在异常块中使用以下代码获取发生错误的行号。

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

阅读本文了解更多信息和示例。

http://www.oracle.com/technetwork/issue-archive/2005/05-mar/o25plsql-093886.html

【讨论】:

  • 是的,当涉及到跟踪异常时,毫无疑问,这是一种更好的方法。不过,小的修正。如果我们需要在 PL/SQL 块的异常部分获取引发异常的行号,调用 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 将是更好的选择。
  • @NicholasKrasnov 感谢您指出这一点。我提供了 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 的链接并输入了 DBMS_UTILITY.FORMAT_ERROR_STACK。
【解决方案3】:

我只想找到最简单的方法来捕捉错误

查找错误的最简单方法称为unit testing。用test driven development严格申请,过一段时间你就不会出很多bug了!

Internet 不缺少说明,Stack Overflow 也不缺少关于这两个主题的问题。开始例如与:

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多