2008-10-07 71 views
33

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

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

10g中有继续CONTINUE吗?我不认为将SP的逻辑重构为解决方法是不实际的,因为我有一个外部循环,一个IF,一个嵌套的IF,然后在该IF内的语句块的结尾处有CONTINUE。

任何帮助将不胜感激,欢呼声。

回答

52

您可以使用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; 
+4

对于丑陋的解决办法+1来处理丑陋的声明:) – 2008-10-07 09:50:15

+2

有时,我们只需键入它,然后覆盖我们的鼻子。 :) – jop 2008-10-07 09:55:31

+0

你也可以使用一个模拟完美继承的构造。并且不添加任何空值:)请参阅下面的回复。 – SRO 2011-08-22 15:15:36

4

您可以将IF重构为一个函数,并在适当的时候返回(如果需要的话)。然后,控制流程将在正确的位置在循环中拾取。

这有道理吗?

1

在Oracle有称为EXIT类似的声明,要么退出循环或功能/过程(如果没有环路从退出)。您可以添加一个WHEN来检查某些情况。

你可以把上面的例子如下:

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

,如果你想从内心深处一些嵌套的循环和逻辑退出,但这可能还不够比一对夫妇的GOTO和更清晰了很多空值。

5

这不是在10g中可用的,但它是一个new feature在11G

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

不完全是优雅的,但简单:

DECLARE 
    done BOOLEAN; 
BEGIN 
    FOR i IN 1..50 LOOP 
     IF done THEN 
     NULL; 
     ELSE 
     <do loop stuff>; 
     END IF; 
    END LOOP; 
END; 
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; 
5

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