【问题标题】:Oracle PL/SQL - how do I run the same block of code for ALL exceptions?Oracle PL/SQL - 如何为所有异常运行相同的代码块?
【发布时间】:2017-04-12 13:26:50
【问题描述】:

甲骨文 11g。这似乎应该是显而易见的,但我还没有看到一个例子。我有 2 个例外,每个例外都需要编写稍微不同的日志消息,然后它们应该执行相同的 UPDATE 和 CONTINUE。

有什么方法可以构造异常,所以我只需要键入一次 UPDATE 和 CONTINUE 语句,同时保持不同的日志记录?

FOR my_rec IN my_cursor
LOOP

BEGIN
...do some stuff

EXCEPTION 
  WHEN NO_DATA_FOUND THEN
    log_detail.new('Skipping record - ID not found');

    UPDATE my_table
    SET operation_result = 'Failed'
    WHERE my_id = my_rec.some_id;

    CONTINUE;

 WHEN OTHERS THEN
    log_detail.new('Skipping record - unknown error');

    UPDATE my_table
    SET operation_result = 'Failed'
    WHERE my_id = my_rec.some_id;

    CONTINUE;
END;
END LOOP;

【问题讨论】:

  • 您能否定义一个单独的过程(可能是本地过程)来执行update(以及您想要的任何其他内容),然后从两个异常处理程序中调用该过程?
  • @JustinCave 我想到了这一点,但我仍然需要继续。我只是觉得我错过了一个技巧,但如果这是唯一的方法......
  • 我不确定您是否需要continue,除非您想跳过循环内的其他逻辑。我只需要一个名为log_detail.new 的过程,并执行update 将日志消息和my_rec.some_id 作为参数。
  • @JustinCave 看起来你是对的,不需要继续。这有助于简化。感谢您的帮助!

标签: oracle exception plsql oracle11g exception-handling


【解决方案1】:

你试过了吗:

FOR my_rec IN my_cursor
LOOP

    BEGIN
    ...do some stuff

    EXCEPTION 

       WHEN OTHERS THEN
         if sqlcode=-1403 then
           log_detail.new('Skipping record - ID not found');
         else
           log_detail.new('Skipping record - unknown error');
         end if;

       UPDATE my_table
       SET operation_result = 'Failed'
       WHERE my_id = my_rec.some_id;

       CONTINUE;
    END;
END LOOP;

【讨论】:

  • 谢谢。我已经接受了这个解决方案。使用 SQLCODE 的好主意。
【解决方案2】:

你可以试试:

DECLARE
    vError      VARCHAR2(1);
    vMessage    VARCHAR2(100);
BEGIN
    FOR my_rec IN my_cursor LOOP
        vError := 'N';
        BEGIN
            ...do some stuff
        EXCEPTION 
            WHEN NO_DATA_FOUND THEN
                vError := 'S';
                vMessage := 'Skipping record - ID not found';
          WHEN OTHERS THEN
                vError := 'S';
                vMessage := 'Skipping record - unknown error';
        END;

        IF vError = 'S' THEN
            log_detail.new(vMessage);

            UPDATE my_table
            SET operation_result = 'Failed'
            WHERE my_id = my_rec.some_id;

            CONTINUE;
        END IF;
    END LOOP;
END;

【讨论】:

  • 感谢您的回复。这会奏效,但它有点软糖。虽然很好的创意解决方案,但我更喜欢 Nicola 的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多