【发布时间】:2016-02-13 19:11:20
【问题描述】:
我有一个尝试插入一些数据的 PL/SQL 过程(在 Oracle 12c 数据库中)。如果失败,它应该检查一个表,看看它是否可以在那里找到一些信息来帮助解决问题。如果它找到信息一切都很好,如果不是它应该重新引发错误。
这是我的代码:
BEGIN
-- Try to insert some data.
INSERT INTO table VALUES x;
EXCEPTION
WHEN OTHERS THEN
BEGIN
-- Check a table to fins some info to help solve the problem.
-- If we find a row here, we can fix it.
-- If not, we should reraise the error.
SELECT * INTO y FROM table WHERE a = b;
-- Do some more stuff here to fix the problem.
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- We could not find anything in the table,
-- so we could not handle the situation.
-- Reraise the error.
RAISE;
END;
END;
这里的问题是RAISE; 语句引发了最新的异常,即SELECT 语句引发的NO_DATA_FOUND。 INSERT 的原始异常在堆栈中更靠后,但不在顶部。
我可以以某种方式“保存”来自INSERT 的错误并重新提出它吗?或者我可以运行一个SELECT INTO,如果它什么也没找到,它不会抛出错误?我的目标是重新引发原始的 INSERT 异常,而不会留下任何 NO_DATA_FOUND 异常的痕迹。
编辑:请参阅 cmets 了解为什么这不是重复的。
【问题讨论】:
-
插入中可能出现的问题以及之后如何更正。你不能在出错之前检查吗?
-
我试图避免在问题中提供太多上下文以专注于问题。我想做的是在违反某些外键约束时进行一些日志记录,并在发生这种情况时生成自定义错误消息。自定义错误消息来自表,我对违反的外键约束进行搜索。
-
感谢您查看我的问题,@Stawros!这不是重复的。您建议的问题的解决方案是简单地使用
RAISE。我已经这样做了,但我想提出原始错误,而不是在异常块中引起的错误。 -
你总是可以在最后重试插入,让它再次失败。
标签: oracle plsql exception-handling oracle12c