在For循环Oracle中捕获错误/异常

时间:2015-03-05 15:41:27

标签: sql oracle

我有一个动态生成物化视图刷新的循环。但是,我知道链接可能会过时,甚至可能会随着时间的推移删除物化视图。

我想在此循环中捕获任何错误,以便在出现错误时继续。

for dbname in (    select distinct db_nm from app_own ) loop 
    dbms_mview.refresh('MV_' || dbname.db_nm || '_ReTable', method => 'C', atomic_refresh=> true);

end loop;

以下是我通常用来捕捉错误的内容......我把它放在下面的循环中,但是我得到一个错误,告诉我异常行不是预期的。在结束循环之后直接放置这段代码会导致捕获一个错误,但不是全部。我如何利用这个循环和下面的异常片段来捕获并继续整个循环?

EXCEPTION
      WHEN OTHERS THEN
        l_errcode    := SQLCODE;
        l_errmessage := SUBSTR(SQLERRM,1,50);
        INSERT INTO log_table (program, code, message, info)
          VALUES (l_this_prog, l_errcode, l_errmessage, 'procedure had an error while running ');

1 个答案:

答案 0 :(得分:1)

只需在循环中使用嵌套块:

for dbname in (    select distinct db_nm from app_own ) loop 
    begin
        dbms_mview.refresh('MV_' || dbname.db_nm || '_ReTable', method => 'C', atomic_refresh=> true);
    EXCEPTION
        WHEN OTHERS THEN
            l_errcode    := SQLCODE;
            l_errmessage := SUBSTR(SQLERRM,1,50);
            INSERT INTO log_table (program, code, message, info)
            VALUES (l_this_prog, l_errcode, l_errmessage,
                'procedure had an error while running ');
    end;
end loop;

异常处理程序是其块的本地,因此它仅适用于内部beginend之间的过程调用。如果过程调用确实抛出一个异常,那么处理程序将记录该异常,并且在该内部块的end之后继续执行 - 在这种情况下就在循环结束时,所以它将再次绕过循环并处理下一个光标行。