第二个“别人例外”

时间:2018-10-11 15:55:49

标签: sql oracle exception-handling

我正在尝试使用EXCEPTION WHERE来捕获我尝试删除的不存在的表,如下所示:

begin
execute immediate 'drop table X';
exception when others then null;
end;

如果表x存在并且我运行此表,那么该表将被删除并且一切都很好。如果再次运行它,则没有要删除的表,但是EXCEPTION会导致脚本愉快地进行。到目前为止,一切都很好。

如果我尝试多次执行此操作,则会出现问题。

如果我运行此脚本来删除表X和Y:

begin
execute immediate 'drop table X';
exception when others then null;

execute immediate 'drop table Y';
exception when others then null;
end;

我得到以下错误信息:

从第1行开始的错误-

begin
execute immediate 'drop table X';
exception when others then null;

execute immediate 'drop table Y';
exception when others then null;
end;

错误报告- ORA-06550:第6行,第1列: PLS-00103:预期以下情况之一时遇到符号“ EXCEPTION”:

(如果循环mod为null,则开始情况为goto声明结束出口    编译时提高回报选择更新,而与          <<继续关闭当前删除删除锁    插入打开回滚保存点集sql执行commit forall    合并管道吹扫 ORA-06550:第7行,第4列: PLS-00103:预期以下情况之一时遇到符号“文件结尾”:

end not pragma最终实例化命令覆盖静态    成员构造函数图 06550。00000-“%s行,%s列:\ n%s” *原因:通常是PL / SQL编译错误。 *动作:

我在这里想念什么?如果我删除了第二个EXCEPTION WHEN语句,那么如果表Y不存在,脚本将失败...我需要捕获此错误...

2 个答案:

答案 0 :(得分:0)

exception when others then null;适用于单个Begin / End块。在一个块中具有多个倍数并不是真的有效。您可以通过单独捕获多个块来解决此问题。

begin
execute immediate 'drop table X';
exception when others then null;
end;
/

begin
execute immediate 'drop table Y';
exception when others then null;
end;
/

答案 1 :(得分:0)

我在这里找到了答案:

Two PLSQL statements with begin and end, run fine separately but not together?

显然我需要

begin
    begin
        some stuff
    end;
    begin
        some other stuff
    end;
end;

或在两个内部块END的每一个之后放置一个/;的...