[DB. PL / SQL] 프로그램 프로 세 스 제어 - 이상 처리

5713 단어 DBplsql
PL / SQL 에 오류 가 발생 하면 시스템 오류 든 응용 오류 든 이상 을 던 집 니 다.현재 PL / SQL 블록 에서 실행 부 서 는 잠 정적 으로 처 리 됩 니 다. 현재 블록 에 이상 처리 장치 가 있 으 면 제 어 는 현재 블록의 이상 처리 장치 로 이동 하여 이상 을 처리 합 니 다.이상 처 리 를 마 친 후 현재 블록 으로 돌아 갈 수 없습니다. 반대로 통 제 는 외부 포위 블록 으로 이동 합 니 다. 있 으 면.
이상 분류:
  • 시스템 이상
  • 프로그래머 정의 이상
  • 정의 이상
    이상 이름 정의
    문법 은 다음 과 같다.
    exception_name EXCEPTION;

    두 가지 인용 방식 이 있 습 니 다.
  • 프로그램의 실행 장치 에서 이상 RAISE 던 지기:
  • RAISE exception_name;
  • 이상 처리 장치 의 WHEN 구문:
  • WHEN exception_name THEN

    이상 이름과 오류 코드 연결
    Oracle 은 일부 이상 한 부분 에 만 이름 을 정의 합 니 다.데이터베이스 에 또 다른 오류 가 있 습 니 다. 잘못된 숫자 와 메시지 만 정의 합 니 다.
    EXCEPTION 사용 가능INIT 컴 파일 명령 은 내부 오류 코드 와 이상 한 이름 을 연결 합 니 다.
    예 를 들 면:
    PROCEDURE my_procedure
    IS
        invalid_month EXCEPTION;
        PRAGMA EXCEPTION_INIT(invalid_month, -1843);
    BEGIN
        ...
    EXCEPTION 
        WHEN invalid_month THEN
    	

    오류 숫자 는 다음 제약 에 부합 되 는 임의의 정 수 를 사용 할 수 있 습 니 다.
  • 사용 불가 - 1403
  • 0 또는 100 을 제외 한 그 어떠한 정수 도 사용 할 수 없다
  • - 100000 이하 의 음수
  • 를 사용 하면 안 됩 니 다.
    이름 시스템 이상
    가장 중요 한 것 도 가장 많이 사용 되 는 이름 이상 은 PL / SQL 의 STANDARD 패키지 에서 찾 을 수 있 습 니 다.
    예 를 들 어 코드 에서 NO 처리DATA_FOUND 이상:
    WHEN NO_DATA_FOUND THEN
      
    WHEN STANDARD.NO_DATA_FOUND THEN

    STANDARD 패키지 에서 미리 정 의 된 이상
    이상 한 작용 범위
  • 이름 이 붙 은 시스템 이상 - 전역 사용 가능;모든 코드 에서 이름 이 붙 은 시스템 이상 을 던 지고 처리 할 수 있 습 니 다
  • 이름 이 붙 은 프로그램 이 정의 하 는 이상 - 블록 을 설명 하 는 실행 장치 에서 만 이상 처리 장치 가 던 져 지고 처리 할 수 있 습 니 다
  • 익명 시스템 이상 - PL / SQL 블록 의 이상 처리 장치 의 WHEN OTHERS 부분 에서 처리 할 수 있 습 니 다.만약 이것 이 지 정 된 이름 의 이상 이 된다 면, 이 이름 의 작용 범 위 는 명 명 된 사용자 정의 이상 과 같다
  • 익명 의 사용자 정의 이상 - RAISE 만 호출 합 니 다.APPLICATION_ERROR 을 정의 하고 호출 프로그램 으로 되 돌려 줍 니 다
  • 이상 을 던지다
    이상 을 던 지 는 세 가지 방법 이 있다.
  • 데이터베이스 에서 오류 가 검출 되 었 을 때 이상 을 던 질 수 있 습 니 다
  • RAISE 문 구 를 사용 하여 이상 던 지기
  • 내 장 된 RAISE 사용 하기APPLICATION_ERROR 프로 세 스 이상 던 지기
  • RAISE 문장 사용 하기
    문법 은 다음 과 같다.
    RAISE exception_name;
    RAISE package_name.exception_name;
    RAISE;
    

    세 번 째 형식 은 이상 처리 장치 의 WHEN 구문 에 만 사용 할 수 있 으 며, 이상 처리 장치 에서 같은 이상 을 다시 던 지 는 데 사 용 됩 니 다.
    예 를 들 면:
    EXCEPTION
        WHEN NO DATA fOUND
        THEN
            ...
            --         NO_DATA_fOUND          
    	RAISE;

    RAISE 사용APPLICATION_ERROR 프로 세 스
    이 과정 을 사용 하 는 것 은 이상 에 오류 메 시 지 를 추가 할 수 있다 는 점 이다.
    이 과정 이 실행 되면 현재 PL / SQL 블록의 실행 이 즉시 종 료 됩 니 다. OUT 와 IN OUT 매개 변수 에 대한 수정 은 취소 되 고 전역 데이터 구조 에 대한 수정 은 패키지 변수 와 같이 데이터베이스 대상 이 스크롤 백 되 지 않 습 니 다.사용 자 는 DML 작업 으로 인 한 수정 을 취소 하기 위해 ROLLBACK 을 명확 하 게 호출 해 야 합 니 다.
    문법 은 다음 과 같다.
    PROCEDURE RAISE_APPLICATION_ERROR(
    num binary_integer,
    msg varchar2,
    keeperorstack boolean default FALSE
    );
  • num 은 오류 번호 이 고 수 치 는 - 20999 와 - 2000 사이
  • 여야 합 니 다.
  • msg 는 오류 메시지
  • keeperorstack 은 이 오 류 를 스 택 에 추가 할 지, 기 존 오류 (FALSE) 를 교체 할 지 여 부 를 표시 합 니 다
  • 처리 이상
    이상 하 게 던 지면 현재 PL / SQL 블록 은 정상 적 인 실행 을 중지 하고 이상 처리 장치 에 제 어 를 전달 합 니 다.이 이상 은 현재 PL / SQL 블록 에서 처리 되 거나 외부 블록 에 던 져 집 니 다.
    어떤 이상 을 포착 하거나 처리 하려 면 이 이상 을 위해 이상 한 핸들 을 써 야 합 니 다.이상 처리 코드 는 프로그램의 모든 실행 가능 한 문장 뒤에 블록의 END 문장 앞 에 있 습 니 다.
    EXCEPTION 키 워드 는 이상 처리 장치 의 시작 과 모든 독립 된 이상 핸들 을 표시 합 니 다.
    DECLARE
       ...declarations...
    BEGIN
        ...executable statements...
    [ EXCEPTION
         ...exception handles... ]
    END;

    이상 구문 (exception handles) 의 문법:
    WHEN exception_name [ OR exception_name ... ]
    THEN
        executable statements
      
    WHEN OTHERS
    THEN
        executable statements
  • 하나의 이상 처리 부 서 는 여러 개의 이상 문형 을 가 질 수 있다.
  • OR 연산 자 를 통 해 하나의 WHEN 구문 에 여러 개의 이상 을 통합 할 수 있 습 니 다 (AND 사용 불가)
  • WHEN 문 구 는 이상 명칭 에 따라 만 사용 할 수 있 고 오류 코드 에 따라 이상 을 포착 할 수 없습니다.
  • WHEN OTHERS 문 구 는 선택 할 수 있 습 니 다.WHEN OTHERS 문 구 는 이상 처리 부분의 마지막 구문 이 어야 합 니 다.그 다음 에 WHEN 문구 가 있다 면 컴 파일 오류 가 발생 할 수 있 습 니 다.

  • 내 장 된 오류 함수
  • SQLCODE - 코드 에서 마지막 으로 던 진 오 류 를 되 돌려 줍 니 다.오류 가 없 으 면 0 으로 돌아 가기;이상 핸들 밖에서 호출 되면 0
  • 으로 돌아 갑 니 다.
  • SQLERRM - 오류 코드 에 대응 하 는 오류 정 보 를 되 돌려 줍 니 다.오류 코드 를 전달 하지 않 으 면 SQLCODE 의 오류 코드 에 대응 하 는 메시지
  • 를 되 돌려 줍 니 다.
  • DBMS_UTILITY.FORMAT_ERROR_STACK - SQLERRM 과 유사 하지만 SQLCODE 오류 코드 와 연 결 된 메시지 만 되 돌려 줍 니 다.임의의 오류 코드 정 보 를 얻 을 수 없습니다
  • DBMS_UTILITY.FORMAT_ERROR_BACKTRACE - 포맷 된 텍스트 문자열 을 되 돌려 줍 니 다. 이 텍스트 문자열 은 프로그램 스 택 이 고 오류 가 발생 한 초기 코드 줄 의 줄 번호
  • 로 되 돌아 갈 수 있 습 니 다.
  • DBMS_UTILITY.FORMAT_CALL_STACK - PL / SQL 프로그램의 호출 스 택 표시
  • 처리 되 지 않 은 이상
    이상 처리 후 후속 코드 를 계속 실행 하 는 방법
    PL / SQL 블록 에 이상 이 발생 하면 정상 실행 장치 가 종료 되 고 이상 처리 장치 로 전 달 됩 니 다.블록 에 이상 이 있 으 면 다 시 는 이 블록의 실행 단원 으로 돌아 갈 수 없습니다.
    그러나 때때로 우 리 는 이상 한 후에 도 계속 실행 할 수 있 는 능력 을 원한 다.
    다음 과 같은 방법 을 사용 하면 이상 한 문 구 를 던 지지 않 고 실행 할 수 있 습 니 다.
    예 를 들 면:
    PROCEDURE change_date IS
    BEGIN
        BEGIN
            DELETE FROM employees WHERE...;
        EXCEPTION
    	WHEN OTHERS THEN log_error;
        END;
    	
        BEGIN	
            UPDATE company SET...;
        EXCEPTION
    	WHEN OTHERS THEN log_error;
        END;
    	
        BEGIN
            INSERT INTO company_history SELECT • FROM company WHERE...;
        EXCEPTION
    	WHEN OTHERS THEN log_error;
        END;
    END;

    실행 장치 에서 던 진 이상 은 항상 현재 블록 에서 처 리 됩 니 다. 일치 하 는 핸들 이 존재 한다 면.모든 구문 에 BEGIN 을 추가 한 다음 에 EXCEPTION 유닛 과 END 문 구 를 추가 하여 '가상 블록' 을 구축 하면 코드 에서 이상 한 실패 범 위 를 제어 할 수 있 습 니 다.
    WHEN OTHERS 의 처리
    WHEN OTHERS 문 구 는 모든 다른 처리 되 지 않 은 이상 을 포착 할 수 있 습 니 다.
    내 장 된 이상 함 수 를 이용 할 수 있 습 니 다. 예 를 들 어 SQLCODE 와 DBMSUTILITY.FORMAT_ERROR_STACK 에서 오류 가 발생 했 습 니 다.

    좋은 웹페이지 즐겨찾기