PL/SQL에서 예외 처리는 프로그램의 안정성을 보장하기 위해 중요한 개념이에요. 특히 데이터베이스와 관련된 작업 중에는 다양한 오류가 발생할 수 있기 때문에, 이를 효과적으로 처리하는 방법을 알아두는 것이 필요해요.
오늘은 오라클의 대표적인 미리 정의된 예외 유형을 살펴보도록 하겠습니다.
Oracle의 주요 예외 유형
PL/SQL에서 자주 사용하는 미리 정의된 예외는 다음과 같습니다.
| 예외 이름 | 오류 코드 | 설명 |
|---|---|---|
ZERO_DIVIDE | ORA-01476 | 0으로 나누기를 시도한 경우 발생합니다. |
NO_DATA_FOUND | ORA-01403 | SELECT INTO 문이 아무런 데이터를 반환하지 않을 때 발생합니다. |
TOO_MANY_ROWS | ORA-01422 | 단일 행만 반환해야 하는 SELECT INTO 문이 여러 행을 반환할 때 발생합니다. |
DUP_VAL_ON_INDEX | ORA-00001 | UNIQUE INDEX 제약 조건을 위반할 때 발생합니다. |
VALUE_ERROR | ORA-06502 | 데이터 변환, 크기 초과 또는 산술 연산 오류가 발생했을 때 발생합니다. |
CURSOR_ALREADY_OPENED | ORA-06511 | 이미 열려 있는 커서를 다시 열려고 할 때 발생합니다. |
CASE_NOT_FOUND | ORA-06592 | CASE 문에서 일치하는 WHEN 절이 없고 ELSE 절도 정의되지 않았을 때 발생합니다. |
PL/SQL 예외 처리 구조
PL/SQL 블록에서 예외 처리는 다음과 같은 구조로 작성합니다
BEGIN
-- 일반적인 작업 실행
EXCEPTION
WHEN <예외 이름> THEN
-- 예외 발생 시 처리할 작업
WHEN OTHERS THEN
-- 예상하지 못한 모든 예외 처리
END;
대표적인 예외 처리 방법 살펴보기
ZERO_DIVIDE: 0으로 나누기
DECLARE
v_salary NUMBER;
v_divisor NUMBER := 0; -- 0으로 나누기 시도
BEGIN
v_salary := 10000 / v_divisor;
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('ERROR: 0으로 나눌 수 없습니다!');
END;
/
ZERO_DIVIDE는 나누기 연산 중 분모가 0일 때 발생합니다. 이를 통해 논리적 오류를 미리 방지할 수 있습니다.
NO_DATA_FOUND: 조회 결과 없음
DECLARE
v_ename EMP.ENAME%TYPE;
BEGIN
SELECT ENAME INTO v_ename
FROM EMP
WHERE EMPNO = -1; -- 존재하지 않는 EMPNO
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('ERROR: 조회된 데이터가 없습니다!');
END;
/
NO_DATA_FOUND는 SELECT INTO 문이 아무런 데이터도 반환하지 않을 때 발생합니다. 데이터 유효성 검사를 강화할 수 있습니다.
TOO_MANY_ROWS: 너무 많은 결과 반환
DECLARE
v_empno EMP.EMPNO%TYPE;
BEGIN
SELECT EMPNO INTO v_empno
FROM EMP; -- 여러 행을 반환
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('ERROR: 단일 행만 반환해야 하지만 여러 행이 반환되었습니다!');
END;
/
TOO_MANY_ROWS는 쿼리 결과가 단일 행을 초과할 경우 발생합니다. 적절한 WHERE 조건을 추가해 문제를 해결할 수 있습니다.
DUP_VAL_ON_INDEX: 중복 값 삽입
BEGIN
INSERT INTO EMP (EMPNO, ENAME) VALUES (1001, 'TEST');
INSERT INTO EMP (EMPNO, ENAME) VALUES (1001, 'TEST2'); -- 중복된 EMPNO
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('ERROR: 중복된 값으로 인해 삽입할 수 없습니다!');
END;
/
DUP_VAL_ON_INDEX는 UNIQUE INDEX 또는 제약 조건을 위반했을 때 발생합니다.
VALUE_ERROR: 데이터 변환 오류
DECLARE
v_number NUMBER;
BEGIN
v_number := TO_NUMBER('ABC'); -- 숫자 변환 불가
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('ERROR: 데이터 변환 중 오류가 발생했습니다!');
END;
/
VALUE_ERROR는 데이터 타입 변환 실패나 부적절한 입력 값으로 인해 발생합니다.
예외 처리 추천 방법
- 명확한 예외 정의
각 예외 상황에 대해 구체적으로 정의하고, 적절한 메시지를 출력하세요. OTHERS로 예외 보완
예상하지 못한 예외를 처리하려면WHEN OTHERS THEN절을 활용하세요.WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('알 수 없는 오류 발생: ' || SQLERRM);- 오류 로그 기록
심각한 오류는 로그 테이블에 기록하거나 파일로 저장해 문제를 추적하세요.
마무리하며
PL/SQL에서 예외 처리는 프로그램의 안정성을 높이는 역할을 해요.
위에서 소개한 예제를 바탕으로, 실제 업무 환경에 맞게 예외 처리를 설계해 보세요. 효과적인 예외 처리는 문제를 미리 예측하고 적절히 대응할 수 있는 가장 강력한 도구가 될 것입니다~
