为什么 PLSQL 中的代码在 "exception" 部分之后不执行?

Why is code in PLSQL not executing after "exception" part?

所以我犯了一个错误,我没有在嵌套的 begin-end 块中立即执行,所以我的代码不起作用。所以基本上我有

begin
 execute immediate 'select * from sales';
 exception when others then null;
 dbms_output.put_line(123);
end;

Dbms_output 没有打印出“123”,我发现我需要在 begin-end 中立即执行。我想确定,所以我的问题是为什么即使没有引发异常,代码也不会在异常部分之后执行?

这里有几件事在起作用 - 解析和执行。

如果table不存在,则无法解析该语句,因此我们会立即得到异常。

SQL> begin
  2     execute immediate 'select * from xxxx';
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at line 2

但是,如果 table 确实存在,那么解析就可以了。因为您从未指定 all 的 INTO,所以我们指定了。我们从不需要执行和开始获取阶段,因此没有发生错误。一种很容易看出我们从未执行过该语句的方法是

SQL> begin
  2     execute immediate 'select 1/count(*) from dual where 1=2';
  3  end;
  4  /

PL/SQL procedure successfully completed.

如果我们执行了,那么我们预计会出现被零除错误。当我们看到一个 INTO 时,我们将需要获取(这将需要执行)。

why is code not executing after exception part even though exception is not raised?

原因很简单——问题中的dbms_output.put_line不在"after exception part".

正确缩进的代码相当于:

begin
    execute immediate 'select * from dual';
exception when others then 
    null;
    dbms_output.put_line(123);
end;
/

异常块是EXCEPTIONSEND;之间的所有内容,如果发生异常将被执行。