본문 바로가기

Database

[ SQL ] EXCEPTION - 예외 처리

프로시져(PROCEDURE) 실행 시 에러가 발생되면 클라이언트에게 직접적으로 에러 메시지가 표출되지 않도록 하기 위해서 예외 처리를 한다. 

 

EXCEPTION 문법

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    O_ERRMSG := '해당테이블에서 데이터를 찾을 수 없습니다.';
    O_ERRMSG := '0으로 나눌 수 없습니다.';
    
    ROLLBACK;
    
    WHEN TOO_MANY_ROWS THEN
    O_ERRCODE := 002;
    O_ERRMSG := '행이 너무 많습니다.';
    
    ROLLBACK;
    
    WHEN OTHERS THEN
    O_ERRCODE := 100;
    O_ERRMSG := '담당자에게 연락주세요.';
    
    ROLLBACK;
  • 구현하고자 하는 업무의 프로시져를 완성한 후 패키지나 프로시져가 끝나기 전에 바로 이어서 하단에 예외 처리를 진행해주면 되는데 이 때 보통 발생할 수 있는 에러 메시지를 나열하고 나머지는 OTHERS 로 처리해준다.
  • OTHERS 는 나눠줄 에러메시지를 명시해주고 마지막에 써줘야한다. 
  • 원래 프로시져 실행 시 에러가 나면 일부 쿼리가 정상적으로 실행되었다 하더라도 프로시져 전체 쿼리가 롤백되나 예외 처리를 하게 되면 옵티마이저는 에러로 받아들이지 않아 EXCEPTION 사용 시 반드시 ROLLBACK 해주어야 한다.

SQL ERROR 종류

  • ACCESS_INTO_NULL : 정의되지 않은 오브젝트 속성에 값을 할당하고자 했을 때 발생하는 에러.                   
  • CASE_NOT_FOUND : CASE문의 when절에 해당되는 조건이 없고 else절도 없을 경우 발생하는 에러.
  • COLLECTION_IS_NULL : 선언되지 않은 컬렉션(nested table, varray)에 존재하는 메서드 이외의 메서드를 사용했을 때 발생되는 에러.
  • CURSOR_ALREADY_OPEN : 이미 열려진 커서를 열려고 시도 했을 때 발생하는 에러.
  • DUP_VAL_ON_INDEX : 유일인덱스에 중복값을 입력햇을 때 발생하는 에러.
  • INVALID_CURSOR : 잘못된 커서 조작이 샐행될 때 발생되는 에러.
  • INVALID_NUMBER : 문자를 숫자로의 변환 시 실패가 될 때 발생하는 에러.
  • LOGIN_DENIED : 잘못된 사용자명이나 암호로 로그인시도시 발생하는 에러.
  • NO_DATA_FOUND : PL/SQL Select문이 한 건도 리턴하지 못하는 경우 발생하는 에러.
  • NOT_LOGGED ON : 접속되지 않은 상태에서 데이터베이스에 대한 요청이 PL/SQL 프로그램으로 실행된 경우 발생되는 에러.
  • PROGRAM_ERROR : PL/SQL이 내부적인 문제를 가지고 있는 경우 발생되는 에러.
  • ROWTYPE_MISMATCH : 할당문에서 호스트 커서 변수와 PL/SQL 커서 변수의 데이터 형이 불일치할 때 발생되는 에러.
  • STORAGE_ERROR : PL/SQL이 실행될 때 메모리가 부족하거나 메모리상에 문제가 일어났을 대 발생하는 헤어.
  • SUBSCRIPT_BEYOND_COUNT : 컬렉션의 요소 갯수보다 더 큰 첨자 값으로 참조한 경우 발생하는 에러.
  • SUBSCRIPT_OUTSIDE_LIMIT : 컬렉션의 첨자 한계를 벗어난 참조가 일어났을 때 발생하는 에러.
  • SYS_INVALID_ROWD : 문자열을 ROWID로 변환할 때 무효한 문자열의 표현일 경우 발생되는 에러.
  • TIMEOUT_ON_RESOURCE : 자원에 대한 대기시간이 초과했을 때 발생하는 에러.
  • TOO_MANY_ROWS : PL/SQL select문이 두건이상의 행을 리턴햇을 때 발생되는 에러.
  • VALUE_ERROR : 산술,변환,절삭 크기 제약에 에러가 생겼을 때 발생되는 에러.
  • ZERO_DIVIDE : 0으로 나누려 했을 때 발생하는 에러.

사용자 예외 처리

 IF V_PRICE < IN_PRICE THEN
  
    RAISE EXCEPT_OVER_MONEY;
  
  END IF;

상단의 에러 이외에도 직접 예외 사항을 만들어서 EXCEPTION 처리 해 줄 수 도 있다. 가령 입력된 숫자가 테이블 내의 숫자보다 작아야 한다고 할 때 조건문을 사용하여 지정해주고 사용할 예외 이름을 정해 RAISE + 예외 이름으로 사용해주면 직접 예외 사항을 만들고 예외 처리 해줄 수 있다.