为什么 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;
/
异常块是EXCEPTIONS
和END;
之间的所有内容,如果发生异常将被执行。
所以我犯了一个错误,我没有在嵌套的 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;
/
异常块是EXCEPTIONS
和END;
之间的所有内容,如果发生异常将被执行。