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

Posted

技术标签:

【中文标题】来自异常块 Oracle 的控制循环语句【英文标题】:Control Loop Statement from Exception Block Oracle 【发布时间】:2018-12-09 19:51:04 【问题描述】:

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

下面是代码sn-p。 i 变量循环遍历表数据集,我要更新表i;如果有任何异常转到 exec1 异常块,执行这些操作,然后再次尝试更新表 i

如果控制转到 exec2 异常,则继续下一次迭代。

我需要帮助,因为在执行 exec1 异常中的步骤后,我该如何尝试再次更新 table(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;

【问题讨论】:

exec1块中的goto label语句报错,想知道解决办法。 代替goto label,使用update (i)。如果代码很多,请创建一个过程。如果是简单的 UPDATE 语句,请将其复制/粘贴到第一个异常块中。 @sqlpractice:请编辑您的问题并包含有关正在引发的错误的信息。谢谢。 @Littlefoot 我想执行 update(i) 直到它进入 exception2 块或成功..如果我将它包含在 exc1 块中并且如果它再次失败并出现相同的异常(exec1) 它会抛出一个错误并且不会被 exec1 块捕获.. 啊哈。我认为 do_stuff 修复了 exec1 错误的原因。您说“goto 抛出错误”- 哪一个? 【参考方案1】:

我试图在 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 错误。

【讨论】:

以上是关于来自异常块 Oracle 的控制循环语句的主要内容,如果未能解决你的问题,请参考以下文章

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理,自定义异常

MySQL数据库编程02

Python控制流程上下文管理器

22:python中的循环控制语句

Oracle PL/SQL之LOOP循环控制语句

1、 C语言三个循环语句分别是 语句, 语句和 语句