中止PL / SQL程序

时间:2009-05-21 05:06:55

标签: oracle plsql

如何让PL / SQL程序中途结束?如果发生异常,我无法找到任何方式优雅地结束程序 - 如果我处理它,它会循环回代码。

基本上我想要做的是强迫应用程序在某些条件下不运行。所以,我想在程序的顶部添加这样的东西:

BEGIN
    IF [condition]
        EXIT
    END IF
    [the rest of the program]
END

建议的方法是抛出异常,但是块可能是一个内部块 - 所以块之外的程序就会继续运行。

5 个答案:

答案 0 :(得分:48)

您可以使用RETURN

MWATSON@> set serveroutput on
MWATSON@> !cat test.sql

BEGIN
 IF 1 = 1 THEN
    DBMS_OUTPUT.PUT_LINE('ABOUT TO EXIT');
    RETURN;
  END IF;
  DBMS_OUTPUT.PUT_LINE('DID NOT EXIT');
END;

MWATSON@> @test
  8  /
ABOUT TO EXIT

PL/SQL procedure successfully completed.

MWATSON@> 

答案 1 :(得分:4)

我知道回复为时已晚,但我还有一种方法在之前的答案中没有提及。

使用RAISE_APPLICATION_ERROR并在EXCEPTION部分中捕获此异常。 由于这会回滚未提交的事务,因此请确保在需要时明确提交它们。

这样,您可以优雅地从程序返回,而不是在使用RETURN时在IF块中进行异常处理。

我用这个作为参考。 http://www.plsql-tutorial.com/plsql-exception-handling.htm

答案 2 :(得分:2)

如果引发该块未处理的异常,则始终会向调用者引发异常。因此,停止处理的最简单方法是引发一个在调用堆栈中不处理的异常。

e.g。

DECLARE
    e_halt_processing EXCEPTION;
BEGIN
    IF [condition] THEN
        RAISE e_halt_processing;
    END IF;
    [the rest of the program]
END;

答案 3 :(得分:1)

我不知道PL / SQL,但你为什么不尝试(用你的话):

BEGIN
    IF [!condition]
        [the rest of the program]
    END IF
END

只是想着

答案 4 :(得分:0)

只要您使用顺序(非嵌套)pl / sql块和单独的异常处理,RAISE就能很好地工作。 如果您在嵌套块中提升expecttion,那么请注意竞争条件。