我正在将TSQL存储过程迁移到PL/SQL,并且遇到了问题 - Oracle 10g中缺少CONTINUE关键字。Oracle 10g中的'CONTINUE'关键字PL/SQL
我读过Oracle 11g将其作为新功能,但不幸的是升级不是一种选择。
10g中有继续CONTINUE吗?我不认为将SP的逻辑重构为解决方法是不实际的,因为我有一个外部循环,一个IF,一个嵌套的IF,然后在该IF内的语句块的结尾处有CONTINUE。
任何帮助将不胜感激,欢呼声。
我正在将TSQL存储过程迁移到PL/SQL,并且遇到了问题 - Oracle 10g中缺少CONTINUE关键字。Oracle 10g中的'CONTINUE'关键字PL/SQL
我读过Oracle 11g将其作为新功能,但不幸的是升级不是一种选择。
10g中有继续CONTINUE吗?我不认为将SP的逻辑重构为解决方法是不实际的,因为我有一个外部循环,一个IF,一个嵌套的IF,然后在该IF内的语句块的结尾处有CONTINUE。
任何帮助将不胜感激,欢呼声。
您可以使用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;
您可以将IF重构为一个函数,并在适当的时候返回(如果需要的话)。然后,控制流程将在正确的位置在循环中拾取。
这有道理吗?
在Oracle有称为EXIT类似的声明,要么退出循环或功能/过程(如果没有环路从退出)。您可以添加一个WHEN来检查某些情况。
你可以把上面的例子如下:
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
EXIT WHEN done;
END LOOP;
END;
,如果你想从内心深处一些嵌套的循环和逻辑退出,但这可能还不够比一对夫妇的GOTO和更清晰了很多空值。
这不是在10g中可用的,但它是一个new feature在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;
事实上,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;
对于未来的搜索,在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.
对于丑陋的解决办法+1来处理丑陋的声明:) – 2008-10-07 09:50:15
有时,我们只需键入它,然后覆盖我们的鼻子。 :) – jop 2008-10-07 09:55:31
你也可以使用一个模拟完美继承的构造。并且不添加任何空值:)请参阅下面的回复。 – SRO 2011-08-22 15:15:36