如何在错误的情况下找出PL / SQL中的行号,过程名称

时间:2010-05-10 11:23:14

标签: oracle plsql unique-constraint ora-00001

我正在使用D2k 6i表单并从存储数据库(oracle9i)程序ORA-00001获取表单上的错误:违反了唯一约束(。)但我无法追踪它将来自哪个程序。 任何人都可以帮我这个

3 个答案:

答案 0 :(得分:1)

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

  

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

答案 1 :(得分:1)

经过多次研究,头部撞击和咬牙切齿之后,我才发现这种模式:

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中包含行号和存储过程名称。 / p>

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

答案 2 :(得分:0)

根据您的问题发布您的例外情况可以让我们更好地了解您遇到的问题。

通常,异常会告诉您错误消息中的包和行号。从那里,您可以查询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];