我有一个动态生成物化视图刷新的循环。但是,我知道链接可能会过时,甚至可能会随着时间的推移删除物化视图。
我想在此循环中捕获任何错误,以便在出现错误时继续。
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 ');
答案 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;
异常处理程序是其块的本地,因此它仅适用于内部begin
和end
之间的过程调用。如果过程调用确实抛出一个异常,那么处理程序将记录该异常,并且在该内部块的end
之后继续执行 - 在这种情况下就在循环结束时,所以它将再次绕过循环并处理下一个光标行。