객체 테이블
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로 해당 기능을 활용하자. (객체 뷰/관계형 뷰)