객체 테이블

  • type형으로 생성되는 테이블.

create or replace type address_type
as object
( city          varchar2(30),
  street      varchar2(30),
  state	varchar2(2),
  zip		number
)
/

create or replace type person_type
as object
( name		varchar2(30),
  dob		date,
  home_addr	address_type,
  work_addr	address_type
)
/

create table people of person_type
/

desc people

Name                                                                                                                                    Null?    Type
----------------------------------------------------------------------------------------------------------------------------------------------- -------- -----
NAME                                                                                                                                             VARCHAR2(30)
DOB                                                                                                                                              DATE
HOME_ADDR                                                                                                                                        ADDRESS_TYPE
WORK_ADDR                                                                                                                                        ADDRESS_TYPE

insert into people values('tom', sysdate, address_type('reston', '123', 'va', 12345), address_type('redwood', '1', 'ca', 32456));

col home for a30
col work for a30
select name, dob, home_addr home, work_addr work from people;

NAME                           DOB          HOME(CITY, STREET, STATE, ZIP) WORK(CITY, STREET, STATE, ZIP)
------------------------------ ------------ ------------------------------ ------------------------------
tom                            10-NOV-12    ADDRESS_TYPE('reston', '123',  ADDRESS_TYPE('redwood', '1', '
                                            'va', 12345)                   ca', 32456)

select name, segcollength
from sys.col$
where obj# = (select object_id
                       from dba_objects
                       where object_name = 'PEOPLE');

NAME                           SEGCOLLENGTH
------------------------------ ------------
SYS_NC_OID$                              16
SYS_NC_ROWINFO$                           1
NAME                                     30
DOB                                       7
HOME_ADDR                                 1
SYS_NC00006$                             30
SYS_NC00007$                             30
SYS_NC00008$                              2
SYS_NC00009$                             22
WORK_ADDR                                 1
SYS_NC00011$                             30
SYS_NC00012$                             30
SYS_NC00013$                              2
SYS_NC00014$                             22

-- SYS_NC_OID$ : 시스템에서 생성된 테이블 객체 ID (RAW(16)), 유일성 제약조건이 존재하고, 유니크 인덱스가 생성.
-- SYS_NC_ROWINFO$ : 중첩 테이블과 같다.
-- SYS_NCnnnnn$ : 중첩된 객체 타입을 스칼라적으로 표현한 것, 컬럼의 타입에 적정하도록 ADDRESS_TYPE을 저장하기 위한 공간 확보.

  • 중첩테이블이든 객체테이블이든 물리적인 저장 기법으로는 사용하지 말자.
    ( 숨겨진 컬럼, 추가적인 인덱스, 놀라운 pseudo컬럼 등이 존재 )
  • PL/SQL로 해당 기능을 활용하자. (객체 뷰/관계형 뷰)