오라클에서 SQL 또는 PL/SQL이 정상적으로 수행되지 못하는 상황을 '오류'라고 합니다. 오류는 크게 두 가지로 나뉩니다:
- 컴파일 오류: 문법 오류 또는 오타로 인해 발생하는 오류입니다.
- 런타임 오류: 프로그램 실행 중 발생하는 오류로, 오라클에서는 이를 '예외(exception)'라고 합니다.
예외가 발생하는 PL/SQL 예제
다음 예제는 문자열 데이터를 숫자 자료형 변수에 대입하려고 시도하는 코드입니다. 이로 인해 런타임 오류가 발생하고 프로그램이 비정상 종료됩니다.
DECLARE
v_wrong NUMBER;
BEGIN
SELECT DNAME INTO v_wrong
FROM DEPT
WHERE DEPTNO = 10;
END;
/
예외 처리
예외 처리는 PL/SQL 실행 중 예외가 발생했을 때 프로그램이 비정상 종료되지 않도록 하는 방법입니다. 이를 위해 EXCEPTION 영역에 코드를 작성합니다. 예외 처리부가 실행되면 예외가 발생한 코드 이후의 내용은 실행되지 않습니다.
다음 예제는 예외 처리부를 작성하여 예외가 발생해도 프로그램이 비정상 종료되지 않도록 합니다.
DECLARE
v_wrong NUMBER;
BEGIN
SELECT DNAME INTO v_wrong
FROM DEPT
WHERE DEPTNO = 10;
DBMS_OUTPUT.PUT_LINE('예외가 발생하면 다음 문장은 실행되지 않습니다');
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('예외 처리 : 수치 또는 값 오류 발생');
END;
/
예외의 종류
오라클 예외는 크게 내부 예외와 사용자 정의 예외로 나뉩니다.
- 내부 예외: 오라클에서 미리 정의한 예외로, 사전 정의된 예외와 이름이 없는 예외가 있습니다.
- 사용자 정의 예외: 사용자가 필요에 따라 직접 정의한 예외입니다.
예외 처리부 작성
예외 처리부는 EXCEPTION 절에서 작성하며, 여러 예외를 명시할 수 있습니다. 예외 핸들러는 WHEN으로 시작하며, 발생한 예외 이름과 일치하는 핸들러의 명령어를 수행합니다. OTHERS는 다른 예외와 일치하지 않을 때 처리할 내용을 작성합니다.
예외 처리부의 기본 형식은 다음과 같습니다:
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;
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;
/
이름 없는 예외 사용
이름이 없는 내부 예외를 사용할 때는 직접 이름을 지정해 주어야 합니다.
사용자 정의 예외 사용
사용자 정의 예외는 오라클에 정의되지 않은 특정 상황을 직접 오류로 정의하는 방식입니다. RAISE 키워드를 사용하여 예외를 직접 만들 수 있습니다.
오류 코드와 오류 메시지 사용
오류 코드와 메시지를 사용하면 발생한 오류 내역을 알 수 있습니다. SQLCODE는 오류 번호를, SQLERRM은 오류 메시지를 반환합니다.
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;
/
위와 같이 예외 처리부를 잘 작성하면 오류가 발생해도 PL/SQL 프로그램을 정상적으로 종료시킬 수 있습니다. 이를 통해 프로그램의 안정성을 높일 수 있습니다.
'Be Smart > SQL' 카테고리의 다른 글
[오라클] Oracle PL/SQL 조건 제어문과 반복 제어문 완벽 가이드 (0) | 2024.06.20 |
---|---|
[Oracle] 오라클 PL/SQL 구조 (0) | 2024.06.18 |
[Oracle] HackerRank 문제 정리 - 6 (0) | 2022.08.10 |
[오라클] 그룹함수 over, partition by (0) | 2022.08.10 |
[Oracle] 고급 쿼리, 계층형 쿼리 (START WITH, CONNECT BY PRIOR, ORDER SIBLINGS BY) (0) | 2022.08.10 |
댓글