Oracle 10g PL / SQL中的'CONTINUE'关键字

时间:2008-10-07 09:28:43

标签: oracle continue

我正在将TSQL存储过程迁移到PL / SQL并遇到问题 - Oracle 10g中缺少CONTINUE关键字。

我已经读过Oracle 11g将此作为一项新功能,但不幸的是升级不是一种选择。

10g中还有CONTINUE的替代品吗?我认为重构SP的逻辑作为解决方法是不切实际的,因为我有一个外部循环,一个IF,然后一个嵌套的IF,然后是该IF中语句块末尾的CONTINUE。 / p>

任何帮助都会非常感激,欢呼。

9 个答案:

答案 0 :(得分:56)

您可以使用goto and labels模拟继续。

DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         GOTO end_loop;
      END IF;
   <<end_loop>>  -- not allowed unless an executable statement follows
   NULL; -- add NULL statement to avoid error
   END LOOP;  -- raises an error without the previous NULL
END;

答案 1 :(得分:10)

虽然它有点复杂且只是假的,但你可以这样使用异常:

DECLARE
  i NUMBER :=0;
  my_ex exception;
BEGIN
  FOR i IN 1..10
  LOOP
      BEGIN
         IF i = 5 THEN
            raise my_ex;
         END IF;
         DBMS_OUTPUT.PUT_LINE (i);
      EXCEPTION WHEN my_ex THEN
         NULL;
      END;
  END LOOP;

END;

答案 2 :(得分:6)

事实上,PL SQL确实有一些东西可以取代CONTINUE。您所要做的就是在循环中添加标签(名称):

declare
   i integer;
begin
   i := 0;

   <<My_Small_Loop>>loop

      i := i + 1;
      if i <= 3 then goto My_Small_Loop; end if; -- => means continue

      exit;

   end loop;
end;

答案 3 :(得分:6)

对于将来的搜索,在oracle 11g中他们添加了一个continue语句,可以像这样使用:

    SQL> BEGIN
  2     FOR i IN 1 .. 5 LOOP
  3        IF i IN (2,4) THEN
  4           CONTINUE;
  5        END IF;
  6        DBMS_OUTPUT.PUT_LINE('Reached on line ' || TO_CHAR(i));
  7     END LOOP;
  8  END;
  9  /
Reached on line 1
Reached on line 3
Reached on line 5

PL/SQL procedure successfully completed.

答案 4 :(得分:5)

它在10g中不可用,但它在11G中是new feature

答案 5 :(得分:4)

你能否将IF重构成一个函数,在适当的时候返回(必要时尽早返回)。然后控制流将在正确位置的环路中拾取。

这有意义吗?

答案 6 :(得分:2)

不完全优雅,但很简单:

DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         NULL;
      ELSE
         <do loop stuff>;
      END IF;
   END LOOP; 
END;

答案 7 :(得分:1)

在Oracle中有一个名为EXIT的类似语句,它退出循环或函数/过程(如果没有循环退出)。你可以添加一个WHEN来检查某些条件。

您可以按如下方式重写上述示例:

DECLARE
   done  BOOLEAN;
BEGIN
    FOR i IN 1..50 LOOP
     EXIT WHEN done;
   END LOOP;
END;

如果你想深入了解一些嵌套的循环和逻辑,这可能还不够,但是比一些GOTO和NULL要清晰得多。

答案 8 :(得分:0)

这并不是问题的答案,但仍然值得注意:

PL / SQL中的continue语句和所有其他使用相同方式的编程语言都容易被误解。

如果编程语言开发人员改用关键字skip,它将更加明智,清晰和简洁。

对我来说,具有C,C ++,Python的背景,...一直很清楚'continue'是什么意思。

但是如果没有这样的历史背景,您可能会结束对这段代码的理解

for i in .. tab_xy.count loop
    CONTINUE WHEN some_condition(tab_xy(i));
    do_process(tab_xy(i));
end loop;

像这样:

遍历表tab_xy的记录。

如果记录满足某条件,则继续,否则忽略该记录。

处理记录。

这种解释是完全错误的,但是如果您将PL / SQL代码想象成一种烹饪收据并大声阅读,则可能会发生这种情况。

实际上,昨天才发生了一位经验丰富的开发人员。