【发布时间】:2011-02-17 15:12:16
【问题描述】:
我正在使用 D2k 6i 表单并从存储数据库 (oracle9i) 过程 ORA-00001: 违反唯一约束 (.) 但我无法追踪它来自哪个过程。 任何人都可以帮助我解决这个问题
【问题讨论】:
标签: oracle plsql unique-constraint ora-00001
我正在使用 D2k 6i 表单并从存储数据库 (oracle9i) 过程 ORA-00001: 违反唯一约束 (.) 但我无法追踪它来自哪个过程。 任何人都可以帮助我解决这个问题
【问题讨论】:
标签: oracle plsql unique-constraint ora-00001
对于后代,这是 OP 找到的解决方案:
好的,在 D2k 表单中,有一个 ON-ERROR 触发器,您可以在其中使用函数 DBMS_ERROR_TEXT 来获取过程、包名、错误来自的语句的行号
【讨论】:
经过大量研究、撞头和咬牙切齿,我发现了这种模式:
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)。
【讨论】:
在您的问题中发布您的例外情况可以让我们更好地了解您所面临的问题。
通常异常会告诉您错误消息中的包和行号。从中,您可以查询 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];
【讨论】: