프로시져(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 + 예외 이름으로 사용해주면 직접 예외 사항을 만들고 예외 처리 해줄 수 있다.
'Database' 카테고리의 다른 글
[ SQL ] FUNCTION(함수) (0) | 2021.05.01 |
---|---|
[ SQL ] WHERE EXISTS, NOT EXIST (0) | 2021.05.01 |
[ SQL ] VIEW - 메모리 상에 존재하는 테이블 (0) | 2021.04.30 |
[ SQL ] 시퀀스 (SEQUENCE) - 자동 증가 값 (0) | 2021.04.30 |
[ SQL ] MERGE INTO - INSERT & UPDATE 한번에 하기 (0) | 2021.04.29 |