如何让PL / SQL程序中途结束?如果发生异常,我无法找到任何方式优雅地结束程序 - 如果我处理它,它会循环回代码。
基本上我想要做的是强迫应用程序在某些条件下不运行。所以,我想在程序的顶部添加这样的东西:
BEGIN
IF [condition]
EXIT
END IF
[the rest of the program]
END
建议的方法是抛出异常,但是块可能是一个内部块 - 所以块之外的程序就会继续运行。
答案 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,那么请注意竞争条件。