더북(TheBook)

중첩 레코드

하나의 레코드를 선언하고 또 다른 레코드를 선언할 때 두 번째 레코드의 필드 타입을 첫 번째 레코드 타입으로 선언할 수 있는데, 이런 형태의 레코드를 중첩 레코드라 한다. 즉 레코드의 필드의 데이터 타입이 레코드인 것이다. 중첩 레코드를 사용한 다음의 예제를 살펴 보자.

입력

    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절에서 일반 레코드처럼 레코드 변수명만 기술할 수는 없고, 각 레코드 필드명을 일일이 기술해야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.