如果第一个语句抛出异常,在任何情况下是否都执行以下语句?

时间:2018-11-19 16:47:12

标签: oracle exception plsql

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

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

2 个答案:

答案 0 :(得分:2)

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异常,因此将引发其他类型的异常,而不是通过异常处理程序运行。但是无论如何,在异常发生时,事情都会停止处理。

答案 1 :(得分:1)

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

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