2010-06-28 4 views
1

PL/SQL에서의 오류 처리에 대해 알고 싶습니다. 누구든지이 주제에 대한 간단한 설명을 찾도록 도와 줄 수 있습니까?pl/sql에서 오류 처리

답변

5

모든 블록에는 예외 처리기가있을 수 있습니다. 예 :이 링크는 더 말할 것

DECLARE 
    /* declare your variables */ 
BEGIN 
    /*Here is your code */ 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     /* HAndle an error that gets raised when a query returns nothing */ 
    WHEN TOO_MANY_ROWS THEN 
     /* HAndle the situation when too much data is returned such as with a select-into */ 
    WHEN OTHERS THEN 
     /* Handle everything else*/ 
END; 

: http://download.oracle.com/docs/cd/B13789_01/appdev.101/b10807/07_errs.htm

링크는 당신에게 당신의 자신의 예외 이름을 만드는 방법에 대한 자세한 나보다 상세뿐만 아니라 예를 보여줍니다.

당신이 함수를 가지고 있고 예외 처리기에서 값을 반환하지 못하면 호출 함수에서 예외가 throw됩니다. 큰 문제는 아니지만 항상 잊어 버린 것 같습니다.

+2

예외가 하위 블록에서 발견되지 않으면 상위 블록 (결국 클라이언트)으로 전파됩니다. 이전 규칙 적용 - 처리 방법을 모르는 오류 조건을 확인하지 마십시오. 그냥 흘러 나오게하십시오. 상위 레벨 블록이이를 catch하거나 호출이 실패하고 클라이언트 응용 프로그램 (또는 사용자)이이를 처리합니다. –

3

다른 답변에서 언급 된 Oracle 기사는 읽을 가치가 있습니다.

PL/SQL 예외를 포착하는 몇 가지 추가 사항은 오류 스택을 잃습니다. 즉, 정확히 어떤 행에서 예외가 발생했는지에 대한 정보가 손실됩니다.

동일한 예외 (예 : NO_DATA_FOUND를 반환 할 수있는 둘 이상의 SQL 문이있는 경우)가 발생할 수있는 여러 위치가 포함 된 코드 블록을 디버깅하기가 어려울 수 있습니다. 한 가지 옵션은 예외 처리기의 일부로 전체 오류 스택을 기록하는 것입니다.

EXCEPTION 
    WHEN TOO_MANY_ROWS THEN 
     myLogger('Some useful information',DBMS_UTILITY.FORMAT_ERROR_STACK); 
END; 

당신이 예외를 포착하면 잡을하려는 지점에 가능한 한 현지로 예외 처리를 유지하고 만 사용해야하는 경우 언제 마지막으로 리조트에서 기타.

또한 가장 유용한 기능 중

EXCEPTION 
    WHEN TOO_MANY_ROWS THEN 
     closeSmtpConnection; 
     RAISE; 
END; 

한 '무언가와 같은 예외를 재 - 제기 할'수는 이름있는 기능입니다 및 Oracle SQL 내부 예외를 잡을 수있어.

DECLARE 
    recompile_failed  EXCEPTION; 
    PRAGMA EXCEPTION_INIT (recompile_failed,-24344); 
BEGIN 
    . . . . . . 
EXCEPTION 
    WHEN recompile_failed THEN 
     emailErrors(pObjectType,pObjectName); 
END; 

이에 대한 역설적으로 사용자 정의 PL /로 'SQL'예외

RAISE_APPLICATION_ERROR(-20001,'my text') 

이것은 호출하는 응용 프로그램에 대한 사용자 정의 텍스트를 전파 할 수있는 유일한 방법입니다 정의 된 사용자를 제기 할 수있는 기능입니다 SQL 예외는 '범위'경계를 넘지 않습니다.

유감스럽게도 사용자 정의 예외에 대해 -20000에서 -20999 범위를 사용할 수 있음에도 불구하고 일부 Oracle 확장 패키지는 이러한 일련 번호를 사용하므로 일련 번호만으로는 호출 오류를 식별 할 수 없습니다 언어.

한 트릭 내가 유용한 발견했습니다는 '상태와 패키지를 만드는 것입니다 (대부분의 사람들은 또한 오류를 기록하고, 종종 테이블에서 오류 텍스트를 유도하기 위해 다른 코드에 RAISE_APPLICATION_ERROR를 포장하는 경향이있다) '변수, 단순한 setter 및 getter 함수 등이 있습니다. 데이터베이스 업데이트와 달리 패키지의 정보는 오류시 롤백되지 않습니다.

오류가 발생하면 패키지에 정보를 설정 한 다음 호출 언어로 getters를 사용하여 검색하여 '기본'예외를 생성하십시오.

사용자 정의 pl/sql 예외는 로컬 코드에서 유용 할 수 있지만 대부분의 경우 다른 제어 구조를 사용하여 피할 수 있습니다 (즉, 대체 GOTO로 사용하지 마십시오).

패키지 헤더에 전역 예외를 만들면 패키지가 반환 할 수있는 예외를 지정하는 것이 좋은 방법 인 것처럼 보이지만 결국 호출 코드는 모든 예외를 처리해야하는 결과를 낳습니다. 기본 패키지의

과거에이 경로를 직접 사용하지 않았으므로 패키지를 자체 포함시키고 RAISE_APPLICATION_ERROR를 사용하거나 텍스트로 오류를 전달하십시오.