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

ber*_*d_k 22 oracle exception

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

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

begin
      EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
    Null;
end;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,是否有任何语法可以通过提供错误代码来捕获错误?

Sat*_*hat 37

您有两个选择:


直接按编号引用异常:

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; 
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用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; 
Run Code Online (Sandbox Code Playgroud)

顺便说一句,是否有任何语法可以通过提供错误代码来捕获错误?

是的,我已经在第一个例子中演示过

有关此变化的进一步阅读:

  • 当 `sqlcode` 不是 955 时,请在你的 WHEN OTHERS 中加薪 =) (2认同)

Jac*_*las 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
*/
Run Code Online (Sandbox Code Playgroud)