SQL 23편: 예외 처리
오류, 예외
오류는 크게 두 가지로 구분된다.
1) 문법이 잘못되었거나 오타로 인한 오류: 컴파일 오류=문법 오류
2) 명령문의 실행 중 발생한 오류: 런타임 오류=실행 오류
이 중에서 오라클은 런타임 오류=실행 오류를 예외라고 한다.
예외 처리부
예외 처리는 예외가 발생하였을 때 프로그램이 비정상 종료가 되는 것을 막기 위해 EXCEPTION 영역에 필요 코드를 작
성하는 것을 뜻한다. 예외 처리부가 실행되면 예외가 발생한 코드 이후의 내용은 실행 되지 않는다. WHEN~THEN 절을 예외 핸들러라고 한다.
기본형식
EXCEPTION
WHEN 예외이름1[OR 예외이름2] THEN
예외 처리에 사용할 명령어;
WHEN 예외이름3[OR 예외이름4] THEN
예외 처리에 사용할 명령어;
...
WHEN OTHERS THEN
예외 처리에 사용할 명령어;
예제
DECLARE
v_wrong NUMBER;
BEGIN
SELECT DNAME INTO v_wrong
FROM DEPT
WHERE DEPTNO = 10;
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('예외 처리 : 수치 또는 값 오류 발생');
END;
/
예외 종류
내부 예외 | 사전 정의된 예외 | 내부 예외 중 예외 번호에 해당하는 이름이 존재하는 예외 |
이름이 없는 예외 | 내부 예외 중 이름이 존재하지 않는 예외 | |
사용자 정의 예외 | 사용자가 직접 정의한 예외 |
- 사전 정의된 예외는 비교적 자주 발생하는 예외에 이름을 붙여 놓은 것이다.
- 이에 비해 이름 없는 예외는 ORA-XXXXX 와 같이 예외 번호는 있지만 이름이 정해져 있지는 않은 예외를 뜻한다. 이름이 없는 예외는 예외 처리부에서 사용하기 위해 이름을 직접 붙여 사용한다.
1) 사전 정의된 예외 사용하기
DECLARE
v_wrong NUMBER;
BEGIN
SELECT DNAME INTO v_wrong
FROM DEPT
WHERE DEPTNO = 10;
DBMS_OUTPUT.PUT_LINE('예외가 발생하면 다음 문장은 실행되지 않습니다');
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('예외 처리 : 요구보다 많은 행 추출 오류 발생');
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('예외 처리 : 수치 또는 값 오류 발생');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('예외 처리 : 사전 정의 외 오류 발생');
END;
/
2) 이름 없는 예외 사용하기
DECLARE
예외이름1 EXCEPTION;
PRAGMA EXCEPTION_INIT(예외이름1, 예외번호);
EXCEPTION
WHEN 예외이름1 THEN
예외 처리 명령어;
END;
3) 사용자 정의 예외 사용하기
DECLARE
사용자예외이름1 EXCEPTION;
BEGIN
IF 예외발생조건 THEN
RAISE 사용자예외이름
...
END IF;
EXCEPTION
WHEN 예외이름1 THEN
예외 처리 명령어;
END;
오류 코드와 오류 메시지 사용하기
발생한 오류 내역을 알고 싶을 때, SQLCODE, SQLERRM 함수를 사용한다. SQLCODE와 SQLERRM은 PL/SQL에서만 사용 가능한 함수로 SQL문에서는 사용할 수 없다.
DECLARE
v_wrong NUMBER;
BEGIN
SELECT DNAME INTO v_wrong
FROM DEPT
WHERE DEPTNO = 10;
DBMS_OUTPUT.PUT_LINE('예외가 발생하면 다음 문장은 실행되지 않습니다');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('예외 처리 : 사전 정의 외 오류 발생');
DBMS_OUTPUT.PUT_LINE('SQLCODE : ' || TO_CHAR(SQLCODE));
DBMS_OUTPUT.PUT_LINE('SQLERRM : ' || SQLERRM);
END;
/