来自异常块Oracle的控制循环语句

时间:2018-12-09 19:51:05

标签: oracle

我想知道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;

1 个答案:

答案 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错误。