【问题标题】:Are following statements executed in any case if the first one throws an exception?如果第一个语句引发异常,是否会执行以下语句?
【发布时间】:2018-11-19 16:47:12
【问题描述】:

当第一个 select 语句发生异常时。在任何情况下都会执行第二个 select 语句和函数吗?还是会跳过以下所有语句?

BEGIN
   SELECT ...
   SELECT ...
   procedure_that_performs_select();
EXCEPTION
   WHEN NO_DATA_FOUND THEN  ...
END

【问题讨论】:

    标签: oracle exception plsql


    【解决方案1】:

    PLSQL 中,发生异常会在异常点停止程序执行并跳转到EXCEPTION 块(如果有)进行处理,否则将向客户端引发异常。

    您可以在测试块中看到此行为。
    这里我们将打印异常前后,可以观察异常没有打印后的下一条语句:

      BEGIN
        DBMS_OUTPUT.PUT_LINE('About to throw an exception');
        RAISE_APPLICATION_ERROR(-20001,'Exception');
        DBMS_OUTPUT.PUT_LINE('Done throwing exception');
      EXCEPTION WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('Handling the exception');
    END;
    /
    

    结果:

    About to throw an exception
    Handling the exception
    

    注意:在您提供的示例中,EXCEPTION 块仅处理 NO DATA FOUND 异常,因此将引发其他类型的异常,而不是通过异常处理程序运行。但无论如何,事情都会在异常发生时停止处理。

    【讨论】:

      【解决方案2】:

      一旦控件进入异常块,它就不会返回到 pl/sql 块的开始或声明部分。 同样,如果您的第一个 select 语句中有错误,则会执行异常块并使用相应的处理程序。如果您既没有提及相应的处理程序,也没有提及 WHEN OTHERS,则控件将转到调用环境(任何过程或接口/IDE)。

      如果您仍然希望运行第二个 select 语句,您可以在异常处理程序中编写另一个 pl/sql 块。

      【讨论】:

        猜你喜欢
        • 2021-03-31
        • 2019-02-16
        • 2017-10-16
        • 2012-10-31
        • 2019-11-28
        • 1970-01-01
        • 2010-10-05
        • 2016-08-18
        • 1970-01-01
        相关资源
        最近更新 更多