首页 文章

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

提问于
浏览
0

我想知道oracle中是否有任何方法可以将控件从异常块重定向到当前的开始/结束块 .

以下是代码段 . 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

    我试图用斯科特的模式模拟你所拥有的东西 .

    如果你把标签移到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错误 .

相关问题