我想知道oracle中是否有任何方法可以将控件从异常块重定向到当前的begin / end块。
以下是代码段。 i 变量遍历表数据集,我想更新表 i ;如果有任何异常,请转到 exec1 异常块,进行处理,然后尝试再次更新表 i 。
如果控制转到 exec2 异常,则继续进行下一个迭代。
我需要帮助,因为在 exec1 异常中执行了步骤之后,如何再次尝试更新表(i);因此,如果再次失败,将在 exec1 异常块中对其进行处理。
FOR i in c_tables
LOOP
BEGIN
---label---
Update (i);
DBMS_OUTPUT.PUT_LINE ('ROWS UPDATED IS: ' || SQL%ROWCOUNT);
EXCEPTION
WHEN exec1 THEN
BEGIN
do_stuff();
goto label;
EXCEPTION WHEN exec2 THEN
do_stuff();
continue;
END;
END;
END LOOP;
答案 0 :(得分:0)
我试图用Scott的模式模拟您拥有的东西。
如果将标签移动到BEGIN的前面而不是后面,这似乎很好。看看:
SQL> DECLARE
2 l_deptno_dflt NUMBER := 50;
3 BEGIN
4 FOR i IN (SELECT distinct deptno FROM emp)
5 LOOP
6 <<this_is_label>> -- put label here ...
7 BEGIN
8 -- <<this_is_label>> -- ... not here
9 UPDATE emp
10 SET deptno = l_deptno_dflt
11 WHERE deptno = i.deptno;
12
13 DBMS_OUTPUT.put_line ('rows updated is ' || SQL%ROWCOUNT);
14 EXCEPTION
15 WHEN OTHERS
16 THEN
17 DBMS_OUTPUT.put_line ('this is exec1');
18
19 BEGIN
20 l_deptno_dflt := 40;
21 goto this_is_label;
22 END;
23 END;
24 END LOOP;
25 END;
26 /
this is exec1
rows updated is 6
rows updated is 5
rows updated is 3
PL/SQL procedure successfully completed.
SQL>
如果它是您最初放置的位置,则会引发上述PLS-00375错误。