PL/SQL 예외 처리 방법: EXCEPTION 블록과 사용자 정의 예외 이해하기
PL/SQL에서 예외 처리는 프로그램의 오류를 관리하는 중요한 방법입니다. EXCEPTION 블록을 사용하여 예외를 처리하고, 사용자 정의 예외를 만들어 특정 상황에 맞춘 오류 처리가 가능합니다. 자주 발생하는 예외와 그 처리 방법을 이해하면 안정적인 코드 작성이 가능합니다.
PL/SQL에서의 예외 처리 방법 (EXCEPTION)
PL/SQL에서 예외 처리는 프로그램 실행 중 발생할 수 있는 오류를 관리하는 중요한 기능입니다. 예외가 발생하면 프로그램의 흐름이 중단되므로, 이를 적절히 처리하여 프로그램의 안정성을 높일 수 있습니다.
예외 처리 구조
PL/SQL에서 예외 처리는 다음과 같은 구조로 이루어집니다:
BEGIN
-- 실행할 PL/SQL 코드
EXCEPTION
WHEN 예외_유형_1 THEN
-- 예외 처리 코드
WHEN 예외_유형_2 THEN
-- 다른 예외 처리 코드
WHEN OTHERS THEN
-- 모든 예외를 처리하는 코드
END;
- BEGIN: 실행할 PL/SQL 코드 블록을 시작합니다.
- EXCEPTION: 예외가 발생했을 때 실행될 코드를 정의합니다.
- WHEN: 특정 예외 유형에 대한 처리 방법을 지정합니다.
- OTHERS: 정의되지 않은 모든 예외를 처리합니다.
예외 처리 예제
아래는 간단한 예외 처리 예제입니다. 이 예제에서는 0으로 나누기를 시도하여 예외를 발생시키고, 이를 처리하는 방법을 보여줍니다.
DECLARE
num1 NUMBER := 10;
num2 NUMBER := 0;
result NUMBER;
BEGIN
result := num1 / num2; -- 0으로 나누기
DBMS_OUTPUT.PUT_LINE('결과: ' || result);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('오류: 0으로 나눌 수 없습니다.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('알 수 없는 오류 발생: ' || SQLERRM);
END;
이 예제에서 num2
가 0이기 때문에 ZERO_DIVIDE
예외가 발생합니다. 이 경우, 해당 예외를 처리하는 코드가 실행되어 오류 메시지가 출력됩니다.
자주 발생하는 예외
PL/SQL에서 자주 발생하는 예외는 다음과 같습니다:
- ZERO_DIVIDE: 0으로 나누기를 시도할 때 발생합니다.
- NO_DATA_FOUND: SELECT INTO 문에서 결과가 없을 때 발생합니다.
- TOO_MANY_ROWS: SELECT INTO 문에서 결과가 2개 이상일 때 발생합니다.
이러한 예외들을 미리 알고 적절히 처리하면, 프로그램의 안정성을 높일 수 있습니다.
사용자 정의 예외
PL/SQL에서는 기본적으로 제공되는 예외 외에도 사용자 정의 예외를 만들어 특정 상황에 맞게 오류를 처리할 수 있습니다. 사용자 정의 예외를 사용하면 프로그램의 가독성을 높이고, 특정 비즈니스 로직에 맞춘 예외 처리가 가능합니다.
사용자 정의 예외 선언
사용자 정의 예외를 선언하기 위해서는 EXCEPTION
키워드를 사용하여 예외를 정의합니다. 예를 들어, 아래와 같이 사용자 정의 예외를 선언할 수 있습니다.
DECLARE
my_custom_exception EXCEPTION; -- 사용자 정의 예외 선언
BEGIN
-- 예외 발생 조건
RAISE my_custom_exception; -- 사용자 정의 예외 발생
EXCEPTION
WHEN my_custom_exception THEN
DBMS_OUTPUT.PUT_LINE('사용자 정의 예외가 발생했습니다.');
END;
위 예제에서 my_custom_exception
이라는 사용자 정의 예외를 선언하고, RAISE
문을 사용하여 해당 예외를 발생시킵니다. 이후 EXCEPTION
블록에서 이 예외를 처리합니다.
사용자 정의 예외와 조건문
사용자 정의 예외는 특정 조건이 만족될 때 발생시킬 수 있습니다. 아래 예제에서는 급여가 특정 값 이하일 때 사용자 정의 예외를 발생시키는 방법을 보여줍니다.
DECLARE
low_salary_exception EXCEPTION; -- 사용자 정의 예외 선언
employee_salary NUMBER := 1500; -- 직원 급여
BEGIN
IF employee_salary < 2000 THEN
RAISE low_salary_exception; -- 조건에 따라 예외 발생
END IF;
DBMS_OUTPUT.PUT_LINE('급여는 적절합니다: ' || employee_salary);
EXCEPTION
WHEN low_salary_exception THEN
DBMS_OUTPUT.PUT_LINE('오류: 급여가 너무 낮습니다.');
END;
이 예제에서 직원의 급여가 2000보다 낮으면 low_salary_exception
예외가 발생하며, 해당 예외를 처리하는 코드가 실행됩니다.
사용자 정의 예외의 장점
- 명확한 오류 처리: 사용자 정의 예외를 사용하면 특정 오류 상황을 명확하게 정의할 수 있어, 코드의 가독성이 향상됩니다.
- 비즈니스 로직에 맞춘 처리: 특정 비즈니스 규칙에 따라 예외를 처리할 수 있어, 더욱 세밀한 오류 관리가 가능합니다.
- 유지보수 용이: 사용자 정의 예외를 사용하면 코드 수정 시 오류 처리 부분을 쉽게 찾아 수정할 수 있습니다.
사용자 정의 예외는 PL/SQL 프로그래밍에서 유용하게 활용될 수 있는 기능으로, 복잡한 비즈니스 로직을 다룰 때 특히 효과적입니다.
자주 발생하는 예외와 처리법
PL/SQL에서 자주 발생하는 예외를 이해하고 적절히 처리하는 것은 안정적인 프로그램을 작성하는 데 매우 중요합니다. 이 섹션에서는 몇 가지 일반적인 예외와 그 처리 방법에 대해 설명하겠습니다.
1. ZERO_DIVIDE 예외
ZERO_DIVIDE
예외는 0으로 나누기를 시도할 때 발생합니다. 이 예외는 수학적으로 정의되지 않은 연산이므로, 이를 적절히 처리해야 합니다.
예제
DECLARE
num1 NUMBER := 10;
num2 NUMBER := 0;
result NUMBER;
BEGIN
result := num1 / num2; -- 0으로 나누기 시도
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('오류: 0으로 나눌 수 없습니다.');
END;
위 예제에서 num2
가 0이기 때문에 ZERO_DIVIDE
예외가 발생하고, 해당 예외를 처리하는 코드가 실행되어 오류 메시지가 출력됩니다.
2. NO_DATA_FOUND 예외
NO_DATA_FOUND
예외는 SELECT INTO
문에서 결과가 없을 때 발생합니다. 이 예외는 데이터베이스에서 특정 데이터를 찾지 못했을 때 발생합니다.
예제
DECLARE
employee_name VARCHAR2(50);
BEGIN
SELECT ename INTO employee_name FROM emp WHERE empno = 9999; -- 존재하지 않는 직원 번호
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('오류: 해당 직원이 존재하지 않습니다.');
END;
이 예제에서 직원 번호 9999는 존재하지 않으므로 NO_DATA_FOUND
예외가 발생합니다. 이 경우 해당 예외를 처리하여 오류 메시지를 출력합니다.
3. TOO_MANY_ROWS 예외
TOO_MANY_ROWS
예외는 SELECT INTO
문에서 결과가 2개 이상일 때 발생합니다. 이 예외는 예상치 못한 다수의 결과가 반환될 때 발생합니다.
예제
DECLARE
employee_name VARCHAR2(50);
BEGIN
SELECT ename INTO employee_name FROM emp WHERE deptno = 30; -- 여러 직원이 속한 부서
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('오류: 결과가 너무 많습니다.');
END;
이 예제에서 부서 번호 30에는 여러 직원이 있으므로 TOO_MANY_ROWS
예외가 발생합니다. 이 경우 해당 예외를 처리하여 오류 메시지를 출력합니다.
4. OTHERS 예외
OTHERS
예외는 정의되지 않은 모든 예외를 처리하는 데 사용됩니다. 이 예외는 마지막에 위치해야 하며, 모든 예외를 포괄적으로 처리할 수 있습니다.
예제
DECLARE
result NUMBER;
BEGIN
result := 10 / 0; -- 0으로 나누기
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('오류: 0으로 나눌 수 없습니다.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('알 수 없는 오류 발생: ' || SQLERRM);
END;
위 예제에서는 ZERO_DIVIDE
예외를 먼저 처리하고, 그 외의 모든 예외는 OTHERS
블록에서 처리합니다. 이를 통해 예외 처리의 포괄성을 높일 수 있습니다.
이와 같이 자주 발생하는 예외를 이해하고 적절히 처리함으로써, PL/SQL 프로그램의 안정성을 높일 수 있습니다.