PL/SQL - 예외 처리: 초보자 가이드

안녕하세요, 미래의 PL/SQL 마에스트로 여러분! 오늘 우리는 PL/SQL의 예외 세계에 빠져들어 보겠습니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요 - 이 주제를 단계별로 안내해 드릴게요. 그리고 저는 수 년 동안 수많은 학생들을 가르쳐온 경험을 바탕으로 이를 설명해 드릴게요. 그럼 커피(또는 차, 당신이 좋아하는 음료를) 한 잔을 마시면서 이 흥미로운 여정에 함께 동참해 보세요!

PL/SQL - Exceptions

예외는 무엇인가요?

정밀하게 다가가 보겠습니다. 예외는 프로그래밍에서 예상치 못한 이벤트입니다. 케이크를 만들고 있는 상상해 봅시다. 레시피를 단계별로 따라가다가 갑자기 계란이 떨어진 것을 발견한다면? 이와 같은 예상치 못한 상황이 프로그래밍에서 예외에 해당합니다.

PL/SQL에서 예외는 프로그램의 정상적인 흐름을 방해하는 예상치 못한 이벤트입니다. 이는 0으로 나누려고 시도하거나 고유 열에 중복 값을 삽입하려고 할 때와 같은 오류일 수 있습니다. 이러한 문제로 프로그램이 다운되는 대신, 우리는 이를 부드럽게 "처리"할 수 있습니다 - 케이크 만들기에 계란 대체재를 사용하는 것과 같은 방식입니다.

예외 처리의 문법

이제 PL/SQL에서 이러한 예외를 어떻게 처리하는지 살펴보겠습니다. 기본적인 구조는 다음과 같습니다:

BEGIN
-- 일반 코드 작성 부분
EXCEPTION
WHEN exception_name1 THEN
-- 예외 1 처리
WHEN exception_name2 THEN
-- 예외 2 처리
WHEN OTHERS THEN
-- 나머지 모든 예외 처리
END;

이를 간단히 설명하자면:

  1. BEGIN 블록에 일반 코드를 작성합니다.
  2. 예외가 발생하면 프로그램은 EXCEPTION 블록으로 이동합니다.
  3. WHEN 절을 사용하여 특정 예외를 처리할 수 있습니다.
  4. WHEN OTHERS 절은 처리하지 않은 모든 예외를 잡습니다.

다음은 간단한 예제입니다:

DECLARE
v_result NUMBER;
BEGIN
v_result := 10 / 0;  -- 이는 0으로 나누는 오류를 발생시킵니다
DBMS_OUTPUT.PUT_LINE('Result: ' || v_result);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Error: Cannot divide by zero!');
END;

이 예제에서 우리는 10을 0으로 나누려고 시도합니다. 이는 수학적으로 불가능합니다. 그러나 프로그램이 다운되지 않고 ZERO_DIVIDE 예외를 잡아 친절한 오류 메시지를 출력합니다.

예외를 일으키기

때로는 특정 조건이 충족되면 우리 자신이 예외를 만들고 싶을 수 있습니다. 이는 축구 경기의 심판처럼 - 파울을 보면哨子를 불립니다!

다음은 그 방법입니다:

DECLARE
v_age NUMBER := 15;
BEGIN
IF v_age < 18 THEN
RAISE_APPLICATION_ERROR(-20001, 'Must be 18 or older');
END IF;
DBMS_OUTPUT.PUT_LINE('Welcome to the club!');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;

이 예제에서 우리는 누군가가 클럽에 입장할 수 있는 나이인지 확인하고 있습니다. 만약 그들이 18세 미만이라면, 우리는 예외를 일으키고 커스텀 오류 메시지를 출력합니다. WHEN OTHERS 절은 이 예외를 잡아 오류 메시지를 출력합니다.

사용자 정의 예외

PL/SQL은 많은 사전 정의된 예외를 제공하지만, 때로는 우리 자신의 예외를 만들어야 할 수 있습니다. 이는 우리의 게임에 새로운 규칙을 만드는 것과 같습니다. 다음은 그 방법입니다:

DECLARE
e_invalid_name EXCEPTION;
v_name VARCHAR2(50) := 'J0hn';
BEGIN
IF NOT REGEXP_LIKE(v_name, '^[A-Za-z]+$') THEN
RAISE e_invalid_name;
END IF;
DBMS_OUTPUT.PUT_LINE('Name is valid: ' || v_name);
EXCEPTION
WHEN e_invalid_name THEN
DBMS_OUTPUT.PUT_LINE('Error: Name should only contain letters');
END;

이 예제에서 우리는 커스텀 예외 e_invalid_name을 만들었습니다. 만약 이름이 문자만 포함하지 않는다면, 이 예외를 일으킵니다. 이를 통해 우리는 이 특정 시나리오를 프로그램 내에서 처리할 수 있습니다.

사전 정의된 예외

PL/SQL은 일반적인 오류 시나리오에 대한 사전 정의된 예외를 제공합니다. 이는 일반적인 부상에 대한 응급 처치 키트와 같습니다. 다음은 가장 자주 사용되는 예외 중 일부입니다:

예외 이름 설명
NO_DATA_FOUND SELECT INTO 문이 행을 반환하지 않을 때 발생
TOO_MANY_ROWS SELECT INTO 문이 1개 이상의 행을 반환할 때 발생
ZERO_DIVIDE 0으로 나누는 시도 시 발생
DUP_VAL_ON_INDEX 고유 인덱스에 중복 값을 삽입하려고 할 때 발생
VALUE_ERROR 산술, 변환, 잘라내기 또는 크기 제약 오류가 발생할 때 발생

다음은 사전 정의된 예외를 사용한 예제입니다:

DECLARE
v_emp_name VARCHAR2(50);
BEGIN
SELECT first_name INTO v_emp_name
FROM employees
WHERE employee_id = 1000;  -- 이 ID가 존재하지 않는다고 가정합니다

DBMS_OUTPUT.PUT_LINE('Employee name: ' || v_emp_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Error: No employee found with that ID');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Error: More than one employee found');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM);
END;

이 예제에서 우리는 직원의 이름을 가져오려고 시도합니다. 만약 직원이 없다면, NO_DATA_FOUND 예외를 잡습니다. 만약 여러 직원이 발견된다면, TOO_MANY_ROWS 예외를 잡습니다. 그리고 예상치 못한 오류는 WHEN OTHERS 절에 의해 잡힙니다.

그럼 여러분! PL/SQL에서 예외 처리의 기본을 다룬 것입니다. 예외를 처리하는 것은 안전벨트를 착용하는 것과 같습니다 - 모든 것이 원활하게 진행되고 있을 때는 불필요하게 보일 수 있지만, 문제가 발생했을 때는 큰 문제를 피할 수 있습니다.

이 개념을 연습하고, 다양한 시나리오를 실험해 보세요. 곧 예외를 처리하는 것을 마스터하실 것입니다. 행복하게 코딩하세요, 그리고 프로그램이 항상 예상치 못한 상황을 부드럽게 처리하길 바랍니다!

Credits: Image by storyset