🧱 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 구조를 만들어보겠습니다.
'database > oracle' 카테고리의 다른 글
🛠️ 25편. Oracle Data Pump 백업 및 복구 (0) | 2025.05.07 |
---|---|
🧱 24편. 패키지(PACKAGE)와 재사용 전략 (0) | 2025.05.07 |
🧱 22편. 프로시저, 함수, 트리거 만들기 (1) | 2025.05.07 |
🧱 21편. PL/SQL 기본 문법과 블록 구조 (0) | 2025.05.07 |
🌳 20편. 통계정보 수집과 옵티마이저 힌트 사용법 (0) | 2025.05.07 |
댓글