특정 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 오류 코드 만 제공하여 오류를 포착하는 구문이 있습니까?

답변:


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

@bernd_k 그래 당신이 그렇게, 그것은 처리되지 않은 예외로 간다
Sathyajith Bhat

2
(가) 때 WHEN OTHERS에 인상을 추가하십시오 sqlcode955 아닙니다) =
빈센트 말그라에게

OP는 여전히 다른 오류가 발생하기를 원할 수 있습니다. "있는 그대로"Exception 블록은 WHEN OTHERS THEN NULL과 똑같이 동작합니다. OP가 좀 더 정확하고 미묘한 것을 원한다고 생각합니다.
Vincent Malgrat

@VincentMalgrat 당신이 맞습니다.
Sathyajith Bhat

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.