【问题标题】:Abort a PL/SQL program中止 PL/SQL 程序
【发布时间】:2010-10-27 20:20:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你是问怎么跳出中间的PL/SQL BEGIN-END块吗?

标签: oracle plsql


【解决方案1】:

您可以使用 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@> 

【讨论】:

  • 有趣的是,这甚至似乎可以在 PROCEDURE 中工作(从技术上讲,它不允许返回任何东西!!)
【解决方案2】:

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

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

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

我以此作为参考。 http://www.plsql-tutorial.com/plsql-exception-handling.htm

【讨论】:

    【解决方案3】:

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

    例如

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

    【讨论】:

    • 换句话说,它是否在内部块中并不重要——只要外部块不处理异常,它就不会“循环”到内部块中,而是会传播给它的调用者。
    • 不应使用异常来跳过代码。你正在重新发明 goto。
    • 我不同意。 PL/SQL 不支持“goto”语句;并且引发异常与“跳过代码”完全不同。如果当前块遇到了它无法处理的条件,则引发异常是您可以告知该条件的调用进程的方式。
    • 只是突然说PL/SQL确实现在有GOTO。当然,这不会改变我的回答一点点:)
    【解决方案4】:

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

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

    只是想

    【讨论】:

    • 这将在后面添加一个 IF THEN END IF 块。` if(EXPRESSION) return;` 更简洁。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 2013-08-30
      • 2012-05-23
      相关资源
      最近更新 更多