PL/SQL 예외 처리 방법, 미리 정의된 예외 (Predefined Exceptions)

PL/SQL에서 예외 처리는 프로그램의 안정성을 보장하기 위해 중요한 개념이에요. 특히 데이터베이스와 관련된 작업 중에는 다양한 오류가 발생할 수 있기 때문에, 이를 효과적으로 처리하는 방법을 알아두는 것이 필요해요.

오늘은 오라클의 대표적인 미리 정의된 예외 유형을 살펴보도록 하겠습니다.

Oracle의 주요 예외 유형

PL/SQL에서 자주 사용하는 미리 정의된 예외는 다음과 같습니다.

예외 이름오류 코드설명
ZERO_DIVIDEORA-014760으로 나누기를 시도한 경우 발생합니다.
NO_DATA_FOUNDORA-01403SELECT INTO 문이 아무런 데이터를 반환하지 않을 때 발생합니다.
TOO_MANY_ROWSORA-01422단일 행만 반환해야 하는 SELECT INTO 문이 여러 행을 반환할 때 발생합니다.
DUP_VAL_ON_INDEXORA-00001UNIQUE INDEX 제약 조건을 위반할 때 발생합니다.
VALUE_ERRORORA-06502데이터 변환, 크기 초과 또는 산술 연산 오류가 발생했을 때 발생합니다.
CURSOR_ALREADY_OPENEDORA-06511이미 열려 있는 커서를 다시 열려고 할 때 발생합니다.
CASE_NOT_FOUNDORA-06592CASE 문에서 일치하는 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_FOUNDSELECT 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_INDEXUNIQUE 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는 데이터 타입 변환 실패나 부적절한 입력 값으로 인해 발생합니다.

예외 처리 추천 방법

  1. 명확한 예외 정의
    각 예외 상황에 대해 구체적으로 정의하고, 적절한 메시지를 출력하세요.
  2. OTHERS로 예외 보완
    예상하지 못한 예외를 처리하려면 WHEN OTHERS THEN 절을 활용하세요.
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('알 수 없는 오류 발생: ' || SQLERRM);
    
  3. 오류 로그 기록
    심각한 오류는 로그 테이블에 기록하거나 파일로 저장해 문제를 추적하세요.

마무리하며

PL/SQL에서 예외 처리는 프로그램의 안정성을 높이는 역할을 해요.

위에서 소개한 예제를 바탕으로, 실제 업무 환경에 맞게 예외 처리를 설계해 보세요. 효과적인 예외 처리는 문제를 미리 예측하고 적절히 대응할 수 있는 가장 강력한 도구가 될 것입니다~

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗