如何仅捕获和处理特定的Oracle异常?


20

这个这个我猜想,对于ORA-00955没有预定义的命名系统异常。

如何重写以下内容以仅捕获错误ORA-00955?

begin
      EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
    Null;
end;

BTW是否有仅通过提供错误代码来捕获错误的语法?

Answers:


33

您有两种选择:


通过数字直接引用异常:

BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    WHEN OTHERS THEN
      IF SQLCODE = -955 THEN
        NULL; -- suppresses ORA-00955 exception
      ELSE
         RAISE;
      END IF;
END; 

另一种选择是使用EXCEPTION_INITPragma指令将已知的Oracle错误号绑定到用户定义的异常。

DECLARE
   name_in_use exception; --declare a user defined exception
   pragma exception_init( name_in_use, -955 ); --bind the error code to the above 
BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    when name_in_use then
       null; --suppress ORA-00955 exception
END; 

BTW是否有仅通过提供错误代码来捕获错误的语法?

是的,我已经在第一个示例中进行了演示

有关此变化的更多阅读:


1
难道我就不能没有别人的举动吗?
bernd_k 2011年

@bernd_k是的,您可以这样做,但是它是未处理的异常
Sathyajith Bhat 2011年

2
如果sqlcode不是955 =,请在您的其他人中加薪)
Vincent Malgrat

OP可能仍想提出其他错误。您的Exception块“原样”的行为与WHEN OTHERS THEN NULL时的行为完全相同。我认为OP需要一些更精确和微妙的东西。
Vincent Malgrat

@VincentMalgrat你是对的。
Sathyajith Bhat 2011年

5

与Sathya已经提出的建议类似,但我想尽可能避免when others使用-未处理的异常通常是未明确处理的异常的正确结果:

create sequence foo;
/*
sequence FOO created.
*/
declare
  name_is_already_used_955 exception;
  pragma exception_init(name_is_already_used_955,-955);
begin
  execute immediate 'create sequence foo';
exception when name_is_already_used_955 then null;
end;
/
/*
anonymous block completed
*/

这正是我从萨莎斯(Sathyas)提议中总结出来的。
bernd_k 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.