我有一个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;
语句引发了最新的异常,即NO_DATA_FOUND
语句抛出的SELECT
。 INSERT
中的原始异常在堆栈中向下,但不在顶部。
我可以以某种方式"保存"来自INSERT
的错误并重新加注?或者我可以运行一个SELECT INTO
如果没有找到任何错误就会抛出错误吗?我的目标是重新加注原始的INSERT
例外,而不会有任何NO_DATA_FOUND
例外的痕迹。
编辑:请参阅评论,说明为何不重复。
答案 0 :(得分:4)
将raise
语句从块中拉出来尝试解决问题。如果您需要重新加入修复失败,请在内部异常处理程序中设置一个标志,并仅在该标志为真时执行raise
。
代码:
DECLARE
b_reraise BOOLEAN := FALSE;
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.
b_reraise := TRUE;
END;
IF b_reraise THEN
RAISE;
END IF;
END;
答案 1 :(得分:1)
可能是这样的:
string underTfs = Microsoft.TeamFoundation.VersionControl.Client.Workstation.Current.IsMapped(path);