1

我正在使用 D2k 6i 表单并从存储数据库(oracle9i)过程 ORA-00001:违反唯一约束(。)的表单上获取错误,但我无法追踪它来自哪个过程。有人可以帮我解决这个问题吗

4

3 回答 3

1

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

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

于 2010-05-11T09:50:44.833 回答
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 中包含行号和存储过程名称。

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

于 2015-03-02T21:55:45.220 回答
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];
于 2010-05-10T11:37:12.150 回答