Oracle Basic PL-SQL 프로그래밍 Basic(4) 예외 처리

9685 단어 oracle 기초
예외 처리:
좋은 PL-SQL 프로그램에서도 오류나 예상치 못한 이벤트가 발생할 수 있으므로 우수한 프로그램은 각종 오류 상황을 처리하고 가능한 한 오류에서 복구할 수 있어야 한다.프로그램이 실행될 때 발생하는 오류가 이상이 되었습니다.이상이 발생하면 문장 설명이 실행을 중지하고 PLSQL은 즉시 제어권을 PLSQL 이상 처리 부분에 맡긴다.EXCEPTION은 Oracle에서 일반적으로 3가지 예외 오류를 처리하는 데 사용됩니다.
다음과 같은 세 가지 예외 오류가 있습니다.
1. 미리 정의(Predefined) 오류
ORACLE이 미리 정의한 예외는 약 24개입니다.이러한 이상 상황에 대한 처리는 프로그램에서 정의할 필요가 없고 ORACLE에서 자동으로 일으킨다.
2. 미리 정의되지 않은 오류(Predefined)
다른 표준 ORACLE 오류입니다.이러한 이상 상황에 대한 처리는 프로그램에서 사용자가 정의한 다음에 ORACLE에서 자동으로 발생시켜야 한다.
3. 사용자 정의(User define) 오류
프로그램 실행 과정에서 프로그래머가 생각하는 비정상적인 상황이 나타난다.이러한 이상 상황에 대한 처리는 사용자가 프로그램에서 정의한 다음에 프로그램에서 현저하게 발생시켜야 한다.
 
비정상 처리 섹션은 일반적으로 PL/SQL 프로그램의 후반부에 배치됩니다.
구문:
EXCEPTION   WHEN first_exception THEN의 첫 번째 예외 처리 코드;   WHEN second_exception THEN 두 번째 비정상 처리 코드인 WHEN OTHERS THEN 기타 비정상 처리 코드인 END;
 
1. 미리 정의된 오류:
Oracle에서 미리 정의된 예외는 약 24개입니다.아래 표와 같다.
오류 번호
예외 오류 정보 이름
설명
ORA-0001
Dup_val_on_index
고유성 제한 위반
ORA-0051
Timeout-on-resource
자원 대기 중 시간 초과 발생
ORA-0061
Transaction-backed-out
사라진 자물쇠가 발생하여 취소되었습니다
ORA-1001
Invalid-CURSOR
잘못된 커서 사용하기
ORA-1012
Not-logged-on
Oracle에 연결되지 않았습니다.
ORA-1017
Login-denied
잘못된 사용자 이름/암호
ORA-1403
No_data_found
SELECT INTO에서 데이터를 찾을 수 없습니다.
ORA-1422
Too_many_rows
SELECT INTO가 여러 행을 반환합니다.
ORA-1476
Zero-divide
0으로 나누기 시도
ORA-1722
Invalid-NUMBER
숫자 변환 실패
ORA-6500
Storage-error
메모리 부족으로 인한 내부 오류
ORA-6501
Program-error
내부 오류
ORA-6502
Value-error
변환 또는 자르기 오류
ORA-6504
Rowtype-mismatch
PL/SQL 변수와 호환되지 않는 기본 커서 변수 행 유형
ORA-6511
CURSOR-already-OPEN
열린 상태의 커서를 열려고 시도합니다.
ORA-6530
Access-INTO-null
null 대상의 속성에 값을 부여하려고 시도합니다
ORA-6531
Collection-is-null
Exists 이외의 컬렉션 (collection) 방법을 null pl/sql 테이블이나 varray에 적용하려고 합니다.
ORA-6532
Subscript-outside-limit
플러그인이나 varray 인덱스에 대한 인용이 성명 범위를 넘어야 합니다
ORA-6533
Subscript-beyond-count
플러그인이나 varray 인덱스에 대한 인용은 집합 중의 요소의 개수보다 크다.
주의: 미리 정의된 이상은 먼저 Oracle의 규범에 어긋나고 그 다음에 Oracle은 20여 개의 이상에 대해서만 이름을 지었습니다. 예를 들어 오류 번호'ORA-01043에서 데이터를 찾지 못했습니다'가'NO DATA FOUND'로 명명되면 PLSQL에서 NO 를 사용합니다.DATA_FOUND에서 포획 처리하면 됩니다.
예:
DECLARE

  V_ID NUMBER;

BEGIN

    SELECT ID INTO v_id FROM es_user WHERE 1=0; 

    DBMS_OUTPUT.put_line(v_id);

    EXCEPTION

      WHEN too_many_rows THEN

           DBMS_OUTPUT.put_line('             ');

      WHEN no_data_found THEN

           DBMS_OUTPUT.put_line('         ');

      WHEN OTHERS THEN

           DBMS_OUTPUT.put_line('    ');

END; 

질의문이 여러 결과를 반환하면 toomany_rows의 비정상 처리 코드, 값이 되돌아오지 않으면 no 실행data_found 비정상 처리 코드입니다.다른 오류가 발생하면others의 비정상 처리 코드를 실행합니다
 
2. 미리 정의되지 않은 오류
미리 정의되지 않은 이상은 다른 표준의 Oracle 오류를 가리키며, 이 전체 이상 처리의 경우, 사용자가 프로그램에서 정의한 다음에 Oracle에서 자동으로 발생시켜야 한다.
이러한 예외 처리에 대해 먼저 정의되지 않은 Oracle 예외를 정의해야 합니다.단계는 다음과 같습니다.
(1) PLSQL 선언 섹션에서 예외를 정의합니다.
DECLARE

  FK_EXCEPTION EXCEPTION;  --      

(2) 정의된 이상을 표준 Oracle 이상과 연결하고 EXCEPTIONINIT 명령문:
  PRAGMA EXCEPTION_INIT(FK_EXCEPTION,-2291);  --2291 Oracle      ,          

(3) PLSQL의 비정상 처리 부분에서 비정상에 대해 상응하는 처리를 한다.(전체 코드)
DECLARE

  FK_EXCEPTION EXCEPTION;

    PRAGMA EXCEPTION_INIT(FK_EXCEPTION,-2291);     --2291 Oracle      ,          

BEGIN

    UPDATE ES_ORDER SET user_id = 100 WHERE ID=1;  --     ID        ,      。

    EXCEPTION

        WHEN fk_exception THEN

            DBMS_OUTPUT.put_line('      ');

END;

미리 정의되지 않은 이상은 미리 정의된 이상과 마찬가지로 Oracle의 규범에 위배된다. 그러나 Oracle은 이러한 이상을 위해 이름을 지어주지 않았다. 예를 들어 오류 번호'ORA-2291', 이름이 없으면 PLSQL 블록의 이상 부분에서 물건을 걸 수 없기 때문에 이상 변수를 미리 정의해야 한다.
3. 사용자 정의 오류
프로그램 실행 과정에서 프로그래머가 생각하는 비정상적인 상황이 발생했다. 이런 이상 상황에 대해 사용자가 프로그램에서 이상을 정의한 다음에 프로그램에 표시하여 인쇄해야 한다.사용자 정의 이상은raise 문장을 통해 터치합니다.이 예외가 발생하면 Professional EXCEPTION에서 예외를 빨리 처리합니다.
이 예외 처리에 대한 단계는 다음과 같습니다.
(1) 성명 부분에서 이상 성명
DECLARE

  AGE_EXCEPTION EXCEPTION;  --      

(2) 이상 정보 던지기
IF v_age < 0 OR v_age > 100 THEN

        RAISE age_exception;
END IF;

(3) PLSQL 예외 처리 섹션에서 예외 상황을 적절하게 처리합니다.
EXCEPTION

    WHEN age_exception THEN

        DBMS_OUTPUT.put_line('     0-100  !');

예: (나이가 0-100 사이인지 판단)
DECLARE

  V_AGE NUMBER := &AGE;

  AGE_EXCEPTION EXCEPTION;

BEGIN

    IF v_age < 0 OR v_age > 100 THEN

        RAISE age_exception;

    END IF;

    EXCEPTION

        WHEN age_exception THEN

            DBMS_OUTPUT.put_line('     0-100  !');

END;

 
예외 저장 프로세스:
위의 3가지 예외 처리 외에도 RAISEAPPLICATION_ERROR 저장 프로세스는 비정상적인 오류 메시지를 재정의할 수 있으며 응용 프로그램에 Oracle과 상호작용하는 방법을 제공합니다.
구문:
  RAISE_APPLICATION_ERROR(error_number,error_message);
  error_number: 사용자가 비정상적으로 지정한 번호를 나타낸다. 이 번호는 -20000~-20999 사이의 마이너스 정수여야 한다.
  error_메시지: 사용자가 비정상적으로 지정한 메시지 텍스트를 표시합니다.메시지 길이는 최대 2048바이트이며, 오류 메시지는 errornumber 관련 텍스트입니다.

좋은 웹페이지 즐겨찾기