◎ User Defined Data Type
☞ OBJECT TYPE |
|
1. 정의 OBJECT TYPE은 사용자가 정의한 복합 데이터 타입으로 (composite data type), 데이터 타입과 이 데이터들을 조작하기 위한 함수 혹은 프로시져를 묶어서 사용자가 정의한 새로운 데이터 타입이다. VARRAY, NESTED TABLE 및 REF는 OBJECT TYPE과 밀접한 관계를 가지며, OBJECT TYPE 자체를 테이블이나 컬럼으로 사용할 수 있다. |
2. 유형 사용자 정의 데이터 타입 |
3. 설명 - OBJEC TYPE은 자동차의 경우, 차종, 년식, 배기량과 같은 속성과, 전진, 후진, 정지와 같은 행동을 지원하는데, 이러한 일반적인 객체지향 관점을 OBJECT TYPE에서 지원함. - OBJECT TYPE은, OBJECT TABLE 또는 특정 컬럼의 타입으로 활용할 수 있으며, VARRAY 또는 NESTED TABLE의 구성 요소로 사용할 수 있음. ( VARRARY나 NESTED TABLE은, OBJECT TYPE 이외에도 BUILT-IN TYPE 및, PL/SQL 변수나, 파라미터, 결과값 등으로 구성 가능함) |
4. 특징 - OBJECT TYPE은, 3가지 구성 요소로 이루어짐. o NAME : OBJECT TYPE에 대한 고유 식별자 o ATTRIBUTE : BUILT-IN TYPE 또는 다른 OBJECT TYPE o METHOD : PL/SQL, C, JAVA와 같은 언어로 작성된 모듈 - 사용자가 정의할 때 마다 생성되므로, 정해진 데이터 타입 코드는 없음. - 내부적으로는 일반 테이블 형태로 변환되어 저장되며, 최 하단 (leaf) 데이터 타입이 BUILT-IN 데이터 타입이 될 때 까지 확장 (explode) 됨. - 실제 데이터는 최 하단 (leaf)의 BUILT-IN 데이터 타입으로 저장됨. |
5. 적용형태1 - OBJECT TABLE

|
6. 작용형태2 - COLUMN OBJECT

|
7. 참고> Object table을 예로 보면, 맨 끝 가지 레벨의 scalar는 (leaf-level scalar) 테이블의 컬럼에 대응합니다. 그리고 시스템에서 자동으로 생성한 2개 컬럼이 테이블에 추가된다. SYS_NC_OID$ : 테이블의 row와 연관된 object ID SYS_NC_OWINFO$ : 각 row의 constructor를 보여 주기 위한 pseudo column 이 pseudo column이 테이블의 저장에 공간을 차지 하지는 않으나 (아래 블럭 덤프 참조) object에 대한 상세한 정보를 얻기 위해 이 컬럼을 쿼리에 사용할 수 있다.
SQL> select sys_nc_oid$ from employees1; SYS_NC_OID$ -------------------------------------- 5DCC862136C2484CE0340800207ECAE5 SQL> select sys_nc_rowinfo$ from employees1; SYS_NC_ROWINFO$ (EMPNO, ENAME) -------------------------------------- EMP_TYP(1, ‘peter’) 덤프 결과 -------- col 0 : [16] 5d cc 86 21 36 c2 48 4c e0 34 08 00 20 7e ca e5 <- OID col 1 : [ 2] c1 02 <- Empno col 2 : [ 5] 70 65 74 65 72 <- Ename |
☞ VARRAY |
|
1. 정의 VARRAY 타입은, 순서를 갖는 엘리먼트들의 배열을 저장하는데 사용된다. |
2. 유형 내장 데이터 타입 ▶ 컬랙션 타입 ▶ 순서를 갖는 배열 |
3. 설명 - VARRAY 컬럼 자체는 스칼라 타입의 컬럼처럼, 단일 값처럼 간주 되며, DML에 의해 조작할 수 있음. - 각 엘리먼트에는 인덱스가 있으며 배열상의 순서를 나타냄. - UPPER BOUND는 정의할 때 지정되며 한번 정의된 후에는 변경할 수 없음. - 엘리먼트들은 배열의 맨 끝부터 삭제할 수 있음. |
4. 특징 - 4000바이트 미만일 경우, IN-LINE 형태로 저장되며, 내부적인 구현은 RAW 타입에 저장하는 방식을 사용함. - 4000바이트 이상일 경우, OUT-OF-LINE 형태로 저장되며 내부적으로는 BLOB 형태로 저장하는 방식을 사용함. |
5. Column Length/Default 스칼라 타입과 같이 정해진 크기나, 기본 값은 없음. |
6. 내부저장방식

|
7. 참고>
Create or replace type person_typ as object (a number, b varchar2(10)); Create or replace type v_person_typ as varray(5); Create table person (col1 number, col2 varchar2(10). col3 v_person_typ) varry col3 store as lob person_tab; Oracle Data Types 이 덤프는, person_typ에 대한 VARRAY(5)에 대한 내용으로, person_typ은 두개 attribute로 정의 되어 있다: a NUMBER, b VARCHAR2(10) col 3 : [32] 88 01 20 01 01 00 02 0b 84 01 0b 02 c1 02 04 70 61 75 6c 0c 84 01 0c 02 c1 03 05 70 65 74 65 72
Byte 1 – 6 VARRAY overhead (byte 3(20) -> 전체 VARRAY column(32 bytes)) Byte 7 (02) VARRAY의 element의 갯수(2 person_typ elements) Byte 8 (0b) 첫번째 array element의 길이 (11 bytes) Byte 9 – 11 Object overhead(84 01 0b) Byte 12 – 14 Length (02) + data (c1,02) -> 1 Byte 15 – 19 Length (04) + data (70,61,75,6c) -> paul Byte 20 (0c) 두번째 element의 길이 (12 bytes) Byte 21 – 23 Object overhead(84 01 0c) Byte 24 – 26 Length (02) + data (c1,03) -> 2 Byte 27 – 32 Length (05) + data (70,65,74,65,72) -> peter |
☞ NESTED TABLE |
|
1. 정의 NESTED TABLE 데이터 타입은, 테이블을 하나의 컬럼에 저장할 때 사용된다. |
2. 유형 내장 데이터 타입 ▶ 컬랙션 타입 ▶ 중첩 테이블 |
3. 설명 - NESTED TABLE순서를 지정하지 않은 레코드나 행의 집합임. - NESTED TABLE의 행은 동일한 구조를 가짐. - NESTED TABLE 의 행은 상위 테이블에 있는 해당 행의 포인터와 함께 상위 테이블과는 별도로 저장됨. - NESTED TABLE 의 저장 영역 특성은 Database 관리자가 정의할 수 있음. - NESTED TABLE 에 대해 미리 정의된 최대 크기는 없음. |
4. 특징 - NESTED TABLE 을 STORE TABLE이라고 하며, 원래 테이블과는 별도 영역에 저장됨. - STORE TABLE 생성시 STORAGE 절을 지정할 수 있음. - STORE TABLE의 특정 ROW는 직접 액세스 할 수없으며,PARENT TABLE을 활용해 액세스 하여야만 함. |
5. Column Length/Default - 스칼라 타입과 같이 정해진 크기나, 기본 값은 없음. - STORE TABLE에는, 시스템에서 자동적으로 생성하는 컬럼이 추가됨.(SYS_NC_ROWINFO$, OBJECT_ID) - PARENT TABLE 입장에서는, RAW(16) 형태로 저장함. |
6. 내부저장방식

|
7. 참고 >
store table 내의 row는 직접 엑세스 불가능합니다. 다음은 그 예입니다. SQL> create table storage ( 2 salesman number (4), 3 elem_id number (6), 4 ordered date, 5 items elements_tab) 6 nested table items store as items_tab; Table created
SQL> insert into storage 2 values(100,123456,SYSDATE, 3 ELEMENTS_TAB (ELEMENTS(175692,120.12), 4 ELEMENTS(167295,130.45), 5 ELEMENTS(127569,99.99))); 1 row created SQL> select * from items_tab; select * from items_tab * ERROR at line 1 : ORA-22812: cannot reference nested table column’s storage table |
☞ REF |
|
1. 정의 REF (“reference”의 줄임)은, 데이터베이스 테이블에 저장된 object에 대한 참조이며 object 그 자체는 아니다. REF 타입은, relational column으로 사용될 수 있으며, object type을 구성하는 데이터 타입으로도 사용될 수 있다. |
2. 유형 내장 데이터 타입 ▶참조 타입 ▶ 참조 타입 |
3. 설명 - OBJECT TABLE에 저장된 각각의 객체는 OID (Object ID)를 갖고 있음. - OID는 마치 관계형 데이터베이스에서 처럼 다른 객체에서 참조할 수 있으며, 참조할 때 - 사용하는 데이터 타입이 REF임. |
4. 특징 - 참조 대상 객체가 삭제되었을 경우, REF는 dangling 상태가 되었다고 하며, OBJECT TABLE에 대해 ANALYZE를 시켜 해결 할 수 있음. - REF는 OID 뿐만 아니라, 메타 정보와 참조되는 ROW의 ROWID 정보를 포함함. - REF 데이터 타입의 코드는 111번임. |
5. Column Length/Default - 표준 REF 타입의 크기는, 42바이트임. (참조되는 객체의 OID 16 바이트, 객체를 포함하는 테이블의 OID 16바이트, ROWID 힌트 10 바이트로 구성됨) - 그러나, PRIMARY KEY에 기반을 둔 OID에 대한 REF 컬럼은, 42 바이트가 아닐 수 있음. |
6. 내부저장방식

|
7. 참고> 예를 들어 department table이 두개 컬럼으로 구성되어 있을 경우 : dname(VARCHAR2), mgr(REF EMP_TYP) 테이블에 한 개 row를 추가한 후에는 다음과 같은 저장 특성을 볼 수 있다.
Oracle Data Types SQL> select dump (mgr, 16) from department; DUMP(MGR,16) -------------------------------------- Typ=111 Len=36: 0,22,2,8,5d,cc,86,21,36,c2,48,4c,e0,34,8 0,20,7e,ca,e5,5d,cc,86,21,36,c1,48,4c,e0,34,8,0,20,7e,ca,e5 SQL> select mgr from department; MGR ------------------------------------00002202085DCC862136C2484CE0340800207 ECAE55DCC862136C1484CE0340800207ECAE5 SQL> selec deref(mgr) from department; DEREF(MGR) (EMPNO,ENAME) ------------------------------------ EMP_TYP(1,’peter’) REF 데이터 타입의 코드는 111번으로 확인이 가능합니다. | |