2014-11-18 2 views
1

이 기사는 Oracle 사이트에서 발견되었습니다 : Managing Exceptional Behavior, Part 1.이 Oracle 코드는 무엇을하고 있습니까?

누군가가 오류 패키지를 생성, 처리,보고 및 이동,보고 및 중지 및 기록하는 절차를 정의했습니다. 이 패키지의 내역은 errpkg입니다.

내가 관심이있는 부분

은 여기에 있습니다 : 그것은 문서에 나타나는 정확히에 붙여 넣기 된 스 니펫을

IF l_errcode BETWEEN -20999 AND -20000 THEN 
    raise_application_error (l_errcode, l_errmsg); 
/* Use positive error numbers -- lots to choose from! */ 
ELSIF l_errcode > 0 AND l_errcode NOT IN (1, 100) THEN 
    raise_application_error (-20000, l_errcode || '-' || l_errmsg); 
/* Can't EXCEPTION_INIT -1403 */ 
ELSIF l_errcode IN (100, -1403) THEN 
    RAISE NO_DATA_FOUND; 
/* Re-raise any other exception. */ 
ELSIF l_errcode != 0 THEN 
    EXECUTE IMMEDIATE 
     'DECLARE myexc EXCEPTION; ' || 
     ' PRAGMA EXCEPTION_INIT (myexc, ' || TO_CHAR (err_in) || ');' || 
     'BEGIN RAISE myexc; END;'; 
END IF; 

. I 은 첫 번째 if 문이 모든 사용자 오류를 다루고 있다고 믿습니다. -209999에서 -20000은 사용자가 만든 예외 용으로 예약되어 있습니다. 첫 번째 elsif 문에서

(errcode를> 0에서 (1,00)는하지 않음), 코드는, 기사에 따르면,하고있는 다음

나는 또한 애플리케이션 -에 대한 긍정적 인 숫자를 처리 특정 오류 숫자. 긍정적 인 오류 메시지 번호를 처리하면 은 -20,999와 -20,000 사이의 오류 번호로 제한되고 일부는 오라클이 사용하는 (비록 내가 1과 100에서 멀리 떨어져 있지만 오라클이 사용하는 두 가지 긍정적 인 오류 번호). 그는 등 (150)과 같은 자신의 코드, (160), (170)의 오류를 선언 행복처럼

그래서 그다지 소리, 그들은 그러나

1 ~ 100, 다음 무엇 발생하지 않는 한 프로 시저의 두 부분은 뭐하는거야? (100, -1403)의 errcode는 무엇입니까? 오류 코드 01403 (데이터 없음)과 관련이 있음을 알 수 있지만 대괄호 (100, -1403)의 위치는 이해할 수 없습니다. 그리고 즉각적인 실행을위한 최종 elsif는 무엇입니까? 나는 그 목적이 무엇인지 알기 위해 고심하고있다.

답변

4

오라클은 in the exception_int documentation과 같이 '데이터 없음'에 대해 -1403과 +100을 모두 사용할 수 있습니다. 또한 precompiler manuals에 언급되어 있습니다. +100은 ANSI 모드에서 사용됩니다. 따라서 IN (100, -1403)은 데이터가 없을 때 발생할 수있는 오류에 대한 가능한 값을 모두 포함합니다.

마지막 부분은 명명 된 예외를 선언하고 즉시 제기하는 것 같습니다. -20000 범위의 오류 코드와 함께 raise application error 만 사용할 수 있으므로 모든 가능한 오류에 대해 해석하거나 선언하지 않아도 기본 제공 예외가 발생합니다. no_data_found은 두 개의 오류 코드가 있기 때문에 명시 적으로 처리되므로 호출자는 실제로 발생하는 오류와 일치하는 오류가 발생합니다.

왜 이런 오류 패키지를 사용하는지 알기가 힘듭니다.이 기사에서는 when others을 잡아 내고이 메커니즘을 사용하여 동일한 코드로 새 예외를 발생시킵니다. 스택 추적을 잃을 것입니다. 원래의 예외 버블을 자연스럽게 버리는 것보다 더 좋은 이유는 아닙니다.

+0

마지막으로 else를 모두 남겨 두시겠습니까? –

+0

@AndrewMartin - 음, 아니요,이 패키지/프로 시저가 '다른 사람이 잡을 때'잡아 당기면 필요합니다. 그렇지 않으면 많은 오류가 발생합니다. 나는 왜 다른 사람들이 언제 간접적으로 잡힌 오류를 재현하지만, 그 과정에서 정보를 잃어 버리는 지에 대해 질문하고 있다고 생각합니다. 어쩌면 그것은 포괄적 인 또는 오류가없는 것으로 의도되었지만 전체적인 접근 방식은 저에게 이상한 것처럼 보입니다. –

0

l_errcode IN (100, -1403)l_errcode = 100 OR l_errcode = -1403의 약식입니다. 어떤 순서로도 가능합니다. l_errcode IN (-1403, 100)의 결과는 정확히 같습니다. 100 및 -1403은 데이터가없는 오류 코드입니다.

실행 즉시가있는 마지막 elsif는 사용자 정의 오류 메시지로 예외를 발생시킵니다.이와 같이 사용자가 정의한 예외를 오류 코드 EXCEPTION_INIT과 연결해야합니다. https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/exceptioninit_pragma.htm

관련 문제