잡동사니

반응형

질문

Oracle Apex 5.0에서 프로세스를 만들고 있습니다. 중복 오류 코드를 제거하도록 도와주세요.

오류가 발생해야하는 여러 조건이 있습니다. 그러나 블록 끝에 sqlerrm 으로 Exception블록을 작성하면 오류 코드가 두 번 발생합니다.

begin
    -----------------------------
    -----some code statements----
    -----------------------------

    if (<condition 1>) then
        -----------------
        ----some code----
        -----------------

    elsif(<condition 2>) then
        raise_application_error(-20001, '----statement1----');

    elseif(<condition 3>) then
        raise_application_error(-20002), '----statement2----');

    end if;

exception
    when others then
        raise_application_error(-20003, SQLERM);
end;

이제 IF 문으로 인해 오류가 발생하면 결과는 다음과 같습니다.

ORA-20001 : ORA-20003 : ---- 문장 1 ---- .

하지만 예를 들어

ORA-20001 : ---- 문 1 ----

어떻게받을 수 있습니까? 여기서 무엇을해야하는지 도와주세요.

 

답변1

RAISE_APPLICATION_ERROR는 맞춤형 오류를 발생시킵니다. 그러나 우리 애플리케이션이 던질 수있는 다른 예외와 마찬가지로 로컬 예외 처리기에 의해 트랩됩니다.

예외 처리기가 모든 오류에 대해 새로운 맞춤형 예외를 발생시킵니다. 이러지마 예외 블록을 제거하여 문제를 쉽게 해결할 수 있습니다. 모든 예외는 수정없이 호출 스택 위로 전파됩니다.

begin
    -----------------------------
    -----some code statements----
    -----------------------------

    if (<condition 1>) then
        -----------------
        ----some code----
        -----------------

    elsif(<condition 2>) then
        raise_application_error(-20001, '----statement1----');

    elseif(<condition 3>) then
        raise_application_error(-20002), '----statement2----');

    end if;

end;

또는 커스텀 예외를 사용할 수 있습니다.

declare
    x_condition2 exception;
    x_condition3 exception;
begin
    -----------------------------
    -----some code statements----
    -----------------------------

    if (<condition 1>) then
        -----------------
        ----some code----
        -----------------

    elsif(<condition 2>) then
        raise x_condition2;

    elseif(<condition 3>) then
        raise x_condition3;

    end if;

exception
    when x_condition2 then
        raise_application_error(-20001, '----statement1----');
    when x_condition3 then
        raise_application_error(-20002, '----statement2----');

end;

모든 오류 (예 : 로깅)에 적용하려는 특정 처리 가없는 한 WHEN OTHERS에 대해 신경 쓸 필요가 없습니다. 기본적으로 전파가 발생하기 때문에 핸들러 섹션에서 예외를 다시 발생시키는 것은 값이 없습니다.


@ 깊은 질문

두 가지 예외를 모두 만들 수 있습니까?

예, 우리는 이것을 할 수 있습니다 :

declare
    x_condition2 exception; 
    PRAGMA EXCEPTION_INIT(x_condition2,-20001); 
    x_condition3 exception; 
    PRAGMA EXCEPTION_INIT(x_condition3,-20002);
….

예외를 선언하면 맞춤형 예외가 생성됩니다. PRAGMA EXCEPTION_INIT는 커스텀 오류 번호를 해당 예외와 연결합니다. 익명 블록에서이 작업을 수행하는 것은 신경 쓰지 않을 것입니다. 왜냐하면 우리는 그것으로부터 많은 가치를 얻지 못하기 때문입니다. 커스텀 오류 메시지를 반환하려면 여전히 raise_application_error 를 실행해야합니다.

pragma exception_init 가 정말 유용한 곳은 프로그램 단위간에 예외를 전달할 때입니다. 프로그램을 호출하여 처리해야하는 예외는 패키지 사양에서 선언해야합니다. pragma exception_init사용은 테이블에서 표준 오류 메시지 조회, 사용자 도움말 텍스트 제공 등과 같은 작업에 도움이 될 수있는 sqlcode 를 사용하여 오류를 식별 할 수 있음을 의미합니다.



 

 

 

 

출처 : https://stackoverflow.com/questions/55356869/duplicate-error-code-throws-while-using-sqlerm-and-exception-in-oracle-apex

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band