Oracle PL / SQL - 如何为所有异常运行相同的代码块?

时间:2016-11-28 18:10:52

标签: oracle exception plsql oracle11g exception-handling

Oracle 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;

2 个答案:

答案 0 :(得分:4)

你有没有尝试过:

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;

答案 1 :(得分:1)

你可以尝试:

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;