본문 바로가기
database/oracle

🧱 23편. 예외 처리, 변수/레코드 타입, 커스텀 구조

by 죄니안죄니 2025. 5. 7.

🧱 23편. 예외 처리, 변수/레코드 타입, 커스텀 구조

이번 글에서는 PL/SQL에서 사용자 정의 변수/레코드 타입 선언, 예외 처리 구조, 커스텀 타입 등을 실무에 맞춰 정리합니다.
단순한 로직을 넘어서 유지보수성과 재사용성을 높이는 고급 PL/SQL 구조를 살펴보겠습니다.


📌 1. 변수 선언 방식

  • 기본 변수: v_sal NUMBER;
  • 컬럼 기반: v_sal EMP.SAL%TYPE;
  • 행 기반: v_emp EMP%ROWTYPE;

예제


DECLARE
  v_name EMP.ENAME%TYPE;
  v_emp  EMP%ROWTYPE;
BEGIN
  SELECT * INTO v_emp FROM EMP WHERE EMPNO = 7369;
  DBMS_OUTPUT.PUT_LINE('사원명: ' || v_emp.ENAME);
END;

🧾 2. 사용자 정의 레코드 타입


DECLARE
  TYPE emp_rec_type IS RECORD (
    empno   NUMBER,
    ename   VARCHAR2(50),
    sal     NUMBER
  );
  
  v_emp_rec emp_rec_type;
BEGIN
  v_emp_rec.empno := 7369;
  v_emp_rec.ename := 'SCOTT';
  v_emp_rec.sal   := 3000;

  DBMS_OUTPUT.PUT_LINE('사번: ' || v_emp_rec.empno || ', 이름: ' || v_emp_rec.ename);
END;

🔁 3. 사용자 정의 TABLE 타입 (컬렉션)

PL/SQL에서는 1차원 배열처럼 사용하는 Table 타입도 정의 가능합니다.


DECLARE
  TYPE emp_table_type IS TABLE OF EMP%ROWTYPE INDEX BY PLS_INTEGER;
  emp_table emp_table_type;
BEGIN
  FOR i IN 1..5 LOOP
    SELECT * INTO emp_table(i) FROM EMP WHERE ROWNUM = i;
    DBMS_OUTPUT.PUT_LINE('이름: ' || emp_table(i).ENAME);
  END LOOP;
END;

🚨 4. 예외 처리 고급 패턴

1) 명시적 예외 처리


BEGIN
  SELECT SAL INTO v_sal FROM EMP WHERE EMPNO = 9999;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('해당 사원이 없습니다.');
END;

2) 예외 발생시 RAISE_APPLICATION_ERROR


IF v_sal < 0 THEN
  RAISE_APPLICATION_ERROR(-20001, '급여가 0보다 작을 수 없습니다');
END IF;

3) 모든 예외 포착


EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('에러: ' || SQLERRM);

🧠 실무 팁

  • 레코드(ROWTYPE)와 컬럼%TYPE을 혼용하여 유지보수성 확보
  • 커스텀 RECORD/TABLE 타입은 패키지 내부에 정의하는 것이 좋음
  • 예외는 반드시 핸들링하거나 로깅 처리로 연결할 것

📝 마무리

이번 글에서는 PL/SQL의 커스텀 타입 선언, 예외 처리 전략, 레코드 사용법을 정리했습니다.
다음 글에서는 패키지(PACKAGE)를 활용한 모듈화 전략을 통해 유지보수성 높은 PL/SQL 구조를 만들어보겠습니다.

댓글