';继续';Oracle 10g PL/SQL中的关键字

';继续';Oracle 10g PL/SQL中的关键字,oracle,continue,Oracle,Continue,我正在将一个TSQL存储过程迁移到PL/SQL,遇到了一个问题—Oracle 10g中缺少CONTINUE关键字 我已经读到Oracle 11g将此作为一项新功能,但不幸的是升级不是一个选项 是否有其他方式可以继续使用10g?我不认为将SP的逻辑重新构造为一种变通方法是切实可行的,因为我有一个外循环,一个IF,然后是一个嵌套IF,然后是IF中语句块末尾的CONTINUE 非常感谢您的帮助,干杯。您能否将IFs重构为一个函数,并在适当的时间返回(如有必要,尽早返回)。然后控制流将在循环中的正确位置

我正在将一个TSQL存储过程迁移到PL/SQL,遇到了一个问题—Oracle 10g中缺少CONTINUE关键字

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

是否有其他方式可以继续使用10g?我不认为将SP的逻辑重新构造为一种变通方法是切实可行的,因为我有一个外循环,一个IF,然后是一个嵌套IF,然后是IF中语句块末尾的CONTINUE


非常感谢您的帮助,干杯。

您能否将IFs重构为一个函数,并在适当的时间返回(如有必要,尽早返回)。然后控制流将在循环中的正确位置拾取


这有意义吗?

您可以使用模拟继续

声明
完成布尔运算;
开始
对于1..50循环中的i
如果这样做的话
转到结束循环;
如果结束;
--除非后面有可执行语句,否则不允许
空;——添加NULL语句以避免错误
结束循环;——在没有前一个NULL的情况下引发错误
结束;

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

您可以将上面的示例重写如下:

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

如果您想退出某些嵌套循环和逻辑,这可能还不够,但比两个goto和NULLs要清楚得多。

10g中没有,但11G中有一个,虽然有点复杂,只是一个伪异常,但您可以这样使用异常:

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;

不是很优雅,但很简单:

DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         NULL;
      ELSE
         <do loop stuff>;
      END IF;
   END LOOP; 
END;
声明
完成布尔运算;
开始
对于1..50循环中的i
如果这样做的话
无效的
其他的
;
如果结束;
端环;
结束;

事实上,PL SQL确实有一些东西需要替换。您只需向循环添加标签(名称):

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;
声明
i整数;
开始
i:=0;
环
i:=i+1;
如果我的意思是继续
出口
端环;
结束;

对于未来的搜索,在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.

这并不完全是对这个问题的回答,但值得注意的是:

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

如果编程语言开发人员调用关键字
skip
,就会更加明智、清晰和简洁

对我来说,C,C++,Python,…“继续”的含义一直很清楚

但如果没有这样的历史背景,您可能最终会解释这段代码

for i in .. tab_xy.count loop
    CONTINUE WHEN some_condition(tab_xy(i));
    do_process(tab_xy(i));
end loop;
像这样:

循环浏览表格选项卡的记录

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

不要处理记录

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


事实上,就在昨天,这件事发生在一位非常有经验的开发同事身上。

有时,我们只需输入信息,然后捂住鼻子即可。:)您还可以使用完全模仿continue的构造。在不添加任何空值的情况下:)请参阅下面我的回答。正如下面的答案所示(@Thorsten),我认为您可能正在寻找退出。只是比后面跟着空行的GOTO稍微不那么难看,但它是有效的。谢谢在这种情况下,退出解决方案不会真正起作用,因为它会终止整个循环,而不是像CONTINUE那样在下一次迭代时才开始。我想我必须采用GOTO解决方案,为大家的建议干杯!我完全同意你的看法。我一直认为continue应该改为skip。
for i in .. tab_xy.count loop
    CONTINUE WHEN some_condition(tab_xy(i));
    do_process(tab_xy(i));
end loop;