保存PL / SQL异常并在以后提高它?

时间:2015-11-12 12:49:37

标签: oracle plsql exception-handling oracle12c

我有一个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语句抛出的SELECTINSERT中的原始异常在堆栈中向下,但不在顶部。

我可以以某种方式"保存"来自INSERT的错误并重新加注?或者我可以运行一个SELECT INTO如果没有找到任何错误就会抛出错误吗?我的目标是重新加注原始的INSERT例外,而不会有任何NO_DATA_FOUND例外的痕迹。

编辑:请参阅评论,说明为何不重复。

2 个答案:

答案 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);