참고 : http://radiocom.kunsan.ac.kr/lecture/oracle/statement_create/create_external_table.html
http://www.psoug.org/reference/externaltab.html
external 테이블은 DB 외부에 저장된 data 파일을 조작하기 위한 접근 방법의 하나로 읽기 전용 테이블이다.
external 테이블의 실제 데이터는 DB 외부에 존재하지만, external 테이블에 대한 metadata는 DB 내부에 존재하는 일종의 가상 테이블이다.
주로 ETL(extraction, transformation, loading)에 주로 사용되는데, ETL은 일종의 tool로 data 파일에 접근하고 조작하여 그 결과를 오라클 내로 loading하는 동작이다.
External 테이블에 대한 두 가지 access drivers
1) LOADER ACCESS DRIVER(oracle loader) :
Oracle의 Loader 기능을 이용해 external table로부터 데이터를 읽어 오는데 사용(SQL*Loader에 의해 해석될 수 있는 어떤 데이터 유형도 access 가능)
2) Import/Export ACCESS DRIVER(oracle Internal) :
Platform에 상관 없이 데이터의 Importing/Exporting이 가능
CREATE DIRECTORY 명령문을 사용하여 file의 위치 정보를 가진 객체를 먼저 생성한 후 CREATE TABLE 명령에 ORGANIZATION EXTERNAL이라는 절을 사용하여 external 테이블을 생성할 수 있다.
특징
- 형식 : CREATE TABLE ....
ORGANIZATION EXTERNAL
- Read Olny
- DML작업 불가능
- Index 생성 불가능
----------------------------------------------------------------------------------------------------
1) CREATE TABLE 명령을 사용하여 external table을 생성한다.
external table은 SQL 명령문을 사용하여 질의가 가능하며, external table에 대해 DML 작업을 수행 할 수 없다. 또한 external table에 대한 index 생성이 불가능하다.
【형식】
CREATE TABLE [스키마.]테이블명
컬럼명 데이터타입 [DEFAULT 값]...
ORGANIZATION EXTERNAL (
[TYPE access_driver형식]
[DEFAULT DIRECTORY 객체명]
[ACCESS PARAMETERS (access_parameters절...)]
[LOCATION (경로:파일명...)]
[REJECT LIMIT n | UNLIMITED]
• type : 접근방식을 기술하는것으로 oracle loader나 oracle internal 방식중 하나(default=oracle loader)
• default directory : external table의 위치 정보를 가진 object를 사용
• create directory : 명령어를 사용하여 생성한 object를 기술한다. access driver가 error에 대한 log 정보를 기록하기 위해서도 사용
• access_parameters : access driver의 parameter를 정의 한다. log file, discard file, bad file을 적을 수 있다.
• location : 각 external data source에 대한 external locator를 기술하는 곳으로주로 file을 사용한다.경로가 생략된 경우, default directory에 지정한 경로를 사용한다.
• reject limits : bad file에 저장되는 reject된 data의 건수를 제한한다. 디폴트=0, bad file은 access parameter 절에기술한다.
----------------------------------------------------------------------------------------------------
2) 우선 External table을 생성하기 전에 external table의 위치 정보를 가진 object를 생성한다.
CREATE DIRECTORY명령문을 사용하여 file의 위치 정보를 가진 object를 생성한다.
【형식】
CREATE [OR REPLACE] DIRECTORY 객체명 AS 경로명
• object명에 schema는 기술할 수 없다.
• directory의 길이는 30byte를 넘을 수 없다.
• path명에 file이 위치해 있는 OS의 절대경로를 기술한다.
• CREATE ANY DIRECTORY 시스템 권한이 있아야 한다.
【예제】
1단계) 읽어올 데이터 파일
$ pwd
/export/home/oracle/app/oracle/oradata
$ cat test.txt
0111,"COREA",
0222,"CHINA",
$
2단계) 디렉토리 만들기
SQL> conn system/manager as sysdba
SQL> create directory test_dir
2 AS '/export/home/oracle/app/oracle/oradata';
디렉토리가 생성되었습니다.
SQL> grant read,write on directory test_dir to scott;
권한이 부여되었습니다.
SQL> conn scott/tiger
Connected.
세션이 변경되었습니다.
SQL>
3단계) 테이블 만들기(외부 데이터 읽어올)
SQL> create table test_ext (
2 aa number(4),
3 bb char(5))
4 ORGANIZATION EXTERNAL ☜ external table 생성을 의미
5 (type oracle_loader ☜ SQL*Loader를 사용하여 데이터를 load함
6 default directory test_dir ☜ 미리 생성한 directory object를 기술
7 access parameters ( ☜ access driver의 변수값 지정
8 records delimited by newline ☜ 줄바꿈으로 record를 구분
9 badfile 'test_bad.bad' ☜ loading되지 못한 record를 저장할 file
10 logfile 'test_log.log' ☜ log 기록을 저장하는 file
11 fields terminated by ',' optionally enclosed by '"' ☜컬럼 구분시 컴마(,) 사용
12 (aa, bb))
13 location('test.txt')) ☜ 읽어올 외부 파일의 이름
14 reject limit unlimited; ☜ bad file에 저장되는 unload되는 record 제한
테이블이 생성되었습니다.
SQL> select * from test_ext;
AA BB
---------- -----
111 COREA
222 CHINA
SQL>
SQL> desc test_ext;
이름 널? 유형
--------------------- -------- ----------------------------
AA NUMBER(4)
BB CHAR(5)
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
TEST_EXT TABLE
SQL>