본문 바로가기
Be Smart/SQL

오라클 PL/SQL 예외 처리: 오류 발생 시 프로그램 비정상 종료 방지 방법

by 반월하 2024. 6. 13.
728x90

 

 

오라클에서 SQL 또는 PL/SQL이 정상적으로 수행되지 못하는 상황을 '오류'라고 합니다. 오류는 크게 두 가지로 나뉩니다:

  1. 컴파일 오류: 문법 오류 또는 오타로 인해 발생하는 오류입니다.
  2. 런타임 오류: 프로그램 실행 중 발생하는 오류로, 오라클에서는 이를 '예외(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 프로그램을 정상적으로 종료시킬 수 있습니다. 이를 통해 프로그램의 안정성을 높일 수 있습니다.

728x90

댓글