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