Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-18
제목 NESTED TYPE 사용 예제
NESTED TYPE 사용 예제
====================

. Nested table은 TABLE을 테이블의 컬럼으로 사용할 수 있도록 하는 데이터
타입이다.
. Nested table을 column으로 갖는 table을 parent table이라고 하고, parent
table이 갖고 있는 권한이나 storage option은 Nested table에 상속된다.
. nested table이 저장되는 segment를 storage table이라고 하고, nested table
선언시 지정해줘야 한다.
. 1: n의 관계나, master-detail과 같은 reference 관계에 유용한 데이터 타입이다.

nested table 컬럼을 처리하는데 다음과 같은 함수를 이용할 수 있다.

- CAST ()
untyped row들을 AS 이하에서 명시한 collection type으로 변환해 준다.

- MULTISET()
SELECT 결과가 여러 ROW를 담고 있을 때, 이들 ROW들을 하나의 데이터 SET으로
간주하여 처리할 수 있도록 해준다.

- THE()
Nested table의 하나의 요소를 처리할 때 사용 되는 함수이다.

- CURSOR()
subquery를 이용하여 임시 table을 구성할 때 사용. multi record를 return
할 수 있다.


< sample >

-- nested type 선언
SQL> create or replace type address as object
(street varchar2(80), city varchar2(80),
state char(2), zip varchar2(10));
SQL> create type address_nested_type as table of address;
SQL> create table address_nested_tbl
( empno number, address address_nested_type )
nested table address store as addresstab ;

-- inner table에 index 생성
SQL> create index add_nest_idx on addresstab (zip);

-- Insert
SQL> insert into address_nested_tbl values
(10, address_nested_type(
address('2 Avocet Drive', 'Redwood Shores', 'CA', '95055'),
address('55 Madison Ave', 'Madison', 'WI', '53715')));
SQL> insert into address_nested_tbl values
(20, address_nested_type(
address('55 Madison Ave', 'Madison', 'WI', '53715')));
SQL> insert into address_nested_tbl values (10, null );

-- inner table에 row 추가 (8.1이상에서 the 대신 table()도 가능)
SQL> insert into the (select address from address_nested_tbl
where empno =20 )
values (address('2 Avocet Drive', 'Redwood Shores',
'CA', '95055'));

-- Select

-- nested table에 저장된 object select하기

SQL> select empno, address from address_nested_tbl;
10 ADDRESS_NESTED_TYPE(
ADDRESS('2 Avocet Drive', 'Redwood Shores', 'CA', '95055'),
ADDRESS('55 Madison Ave', 'Madison', 'WI', '53715'))
20 ADDRESS_NESTED_TYPE(
ADDRESS('55 Madison Ave', 'Madison', 'WI', '53715') ,
ADDRESS('55 Madison Ave', 'Madison', 'WI', '53715'))
10


-- 개별 row select
-- table(), the() 유사한 기능 수행 => the()는 이후 없어질 예정
-- the()절 안에는 object가 바로 올 수 없고, subquery문 기술
-- detail row에 조건 주어 select

SQL> select p.empno,
cursor ( select street from table(p.address) a
where state ='WI') sta
from address_nested_tbl p where empno = 10;

10 CURSOR STATEMENT : 2
CURSOR STATEMENT : 2
Comment
등록된 코멘트가 없습니다.