중첩 레코드
하나의 레코드를 선언하고 또 다른 레코드를 선언할 때 두 번째 레코드의 필드 타입을 첫 번째 레코드 타입으로 선언할 수 있는데, 이런 형태의 레코드를 중첩 레코드라 한다. 즉 레코드의 필드의 데이터 타입이 레코드인 것이다. 중첩 레코드를 사용한 다음의 예제를 살펴 보자.
입력
DECLARE
-- 부서번호, 부서명을 필드로 가진 dep_rec 레코드 타입 선언
TYPE dep_rec IS RECORD (
dep_id departments.department_id%TYPE,
dep_name departments.department_name%TYPE );
--사번, 사원명 그리고 dep_rec(부서번호, 부서명) 타입의 레코드 선언
TYPE emp_rec IS RECORD (
emp_id employees.employee_id%TYPE,
emp_name employees.emp_name%TYPE,
dep dep_rec -- 필드의 타입이 레코드
);
-- emp_rec 타입의 레코드 변수 선언
vr_emp_rec emp_rec;
BEGIN
-- 100번 사원의 사번, 사원명, 부서번호, 부서명을 가져옴
SELECT a.employee_id, a.emp_name, a.department_id, b.department_name
INTO vr_emp_rec.emp_id, vr_emp_rec.emp_name, vr_emp_rec.dep.dep_id, vr_emp_rec.dep.dep_name
FROM employees a,
departments b
WHERE a.employee_id = 100
AND a.department_id = b.department_id;
-- 레코드 변수 값 출력
DBMS_OUTPUT.PUT_LINE('emp_id : ' || vr_emp_rec.emp_id);
DBMS_OUTPUT.PUT_LINE('emp_name : ' || vr_emp_rec.emp_name);
DBMS_OUTPUT.PUT_LINE('dep_id : ' || vr_emp_rec.dep.dep_id);
DBMS_OUTPUT.PUT_LINE('dep_name : ' || vr_emp_rec.dep.dep_name);
END;
결과
emp_id : 100
emp_name : Steven King
dep_id : 90
dep_name : 기획부기획부
emp_rec라는 레코드 타입에는 사번과 사원명 그리고 dep라는 필드가 있는데, 이 dep 필드는 부서번호와 부서명을 필드로 가진 dep_rec라는 레코드 타입이다. 이렇게 레코드 타입의 필드를 가진 레코드가 중첩 레코드다. 중첩 레코드에서 중첩된 필드는 “레코드변수명.필드명.서브필드명” 형태로 참조가 가능하다. 앞의 소스코드에서 보듯이 emp_rec를 타입으로 하는 vr_emp_rec 레코드 변수는, 100번 사원의 부서명을 참조하려면 vr_emp_rec.dep.dep_name 형태로 참조하거나 값을 할당할 수 있다. 한 가지 주의할 점은 중첩 레코드는, SELECT INTO, INSERT문의 VALUES, UPDATE 문의 SET ROW절에서 일반 레코드처럼 레코드 변수명만 기술할 수는 없고, 각 레코드 필드명을 일일이 기술해야 한다.