在上一篇中我們介紹了SQL*Loader中最重要的文件——控制文件,而本篇要介紹控制文件中最重要的部分——字段列表,字段列表的作用是把數據文件中的記錄和數據庫中表的列對應起來,下面是字段列表的一個例子,本篇我們將一一講解它們的意思。
.
.
.
1 (hiredate SYSDATE, 2 deptno POSITION(1:2) INTEGER EXTERNAL(2) NULLIF deptno=BLANKS, 3 job POSITION(7:14) CHAR TERMINATED BY WHITESPACE NULLIF job=BLANKS "UPPER(:job)", mgr POSITION(28:31) INTEGER EXTERNAL TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS, ename POSITION(34:41) CHAR TERMINATED BY WHITESPACE "UPPER(:ename)", empno POSITION(45) INTEGER EXTERNAL TERMINATED BY WHITESPACE, sal POSITION(51) CHAR TERMINATED BY WHITESPACE "TO_NUMBER(:sal,'$99,999.99')", 4 comm INTEGER EXTERNAL ENCLOSED BY '(' AND '%' ":comm * 100" )
指定列和字段的對應關系
我們知道SQL*Loader的工作就是把數據文件里的記錄加載到數據庫表中,因此一定要有數據文件的記錄字段和數據庫表的列的對應關系,因此在控制文件的字段列表里,我們首先得配置這種關系。這里要注意的是,並不需要表的所有列都出現在字段列表中,沒有出現的列,SQL*Loader會自動用NULL填充。
但有一種字段比較特殊,叫解析字段(以FILTER標識),它不跟表的列匹配,它的主要作用是給WHEN語句提供條件判斷的依據,如下所示:
INTO TABLE dept
WHEN recid = 1
(recid FILLER POSITION(1:1) INTEGER EXTERNAL,
deptno POSITION(3:4) INTEGER EXTERNAL,
dname POSITION(8:21) CHAR)
INTO TABLE emp
WHEN recid <> 1
(recid FILLER POSITION(1:1) INTEGER EXTERNAL,
empno POSITION(3:6) INTEGER EXTERNAL,
ename POSITION(8:17) CHAR,
deptno POSITION(19:20) INTEGER EXTERNAL)
指定位置(POSITION)
我們知道記錄在數據文件中是以字節存儲的,如果記錄的每個字段大小是已知的,那么我們可以使用POSITION字句指定字段在記錄中的字節位置,其語法如下:

下面是一些例子:
ename POSITION (1:20) CHAR empno POSITION (22-26) INTEGER EXTERNAL allow POSITION (*+2) INTEGER EXTERNAL TERMINATED BY "/"
上例中,1~20字節對應ename列,22~26字節對應empno列,*表示從上一個字段的后一個字節開始(即27),所以*+2=29,也就是說從第29個字節開始,直到遇到分隔符'/'為止的所有字節,都屬於allow列。
數據類型
SQL*Loader根據控制文件里定義的數據類型讀取數據文件的字段,然后把它發給數據庫表里對應的列,這里需要注意的是:控制文件定義的數據類型並不需要和數據庫里對應的表列一樣,因為SQL*Loader會自動轉換,包括字符集的轉換,當然,你必須得保證它們之間是可以轉換的,否則會報錯。
控制文件的數據類型分為兩種,分別是可移植的和不可移植的,所謂可移植的數據類型就是和具體平台無關,而不可移植的正好相反。
不可移植的數據類型有:integer(n), smallint, float, double, byteint, zoned,decimal,vargraphic, varchar, varraw, long varraw,
通常情況下,我都采用可移植的數據類型,所以下面我們重點介紹可移植的數據類型:
CHAR
最常用也是默認的數據類型,其語法如下:

length表示CHAR的最大長度,如果不指定則為256,這里一定要跟數據庫的CHAR區分開,SQL*Loader的CHAR是個變長的數據類型,有點類似於數據庫的varchar。
Datatime
-
DATE -
TIME -
TIME WITH TIME ZONE -
TIMESTAMP -
TIMESTAMP WITH TIME ZONE -
TIMESTAMP WITH LOCAL TIME ZONE
Interval
-
INTERVAL YEAR TO MONTH -
INTERVAL DAY TO SECOND
Numeric EXTERNAL
以字符形式表示數值型的數據類型,包括(INTEGER EXTERNAL, FLOAT EXTERNAL, DECIMAL EXTERNAL, and ZONED EXTERNAL),他的特性和CHAR很像,在實際使用中,一般都采用它來代替不可移植的數值型數據類型。
分隔符
CHAR, datetime, interval, numeric EXTERNAL字段可以使用分隔符來標識,分隔符的語法如下:


Terminated by 和 Enclosed by 可以單獨使用,也可以配合使用,以下是一些例子:
TERMINATED BY ',' a data string,
ENCLOSED BY '"' "a data string"
TERMINATED BY ',' ENCLOSED BY '"' "a data string",
ENCLOSED BY '(' AND ')' (a data string)
字段條件設置(WHEN, NULLIF, DEFAULTIF)
NULLIF:如果符合條件則設為NULL,下面是一個例子:
ull_fieldname ... NULLIF column_name=BLANKS
BLANKS參數表示空白的意思(不包括tab),上面的例子表示如果字段為BLANKS,則字段為NULL。
SQL*Loader生成數據
有時候我們可能希望有些數據在加載數據的過程中自動生成,SQL*Loader提供了一些參數用於生成數據。
CONSTANT
設置列的值為常量,語法如下:
column_name CONSTANT value
表達式
設置列的值為表達式的值,語法如下:
column_name EXPRESSION "SQL string"
當前日期
設置列的值為當前日期,語法如下:
column_name SYSDATE
序列
設置列的值為唯一序列數字,語法如下:

例子:
- id SEQUENCE(1,1) 以1開始遞增
這里要注意的是:無法使用Oracle數據庫里的sequence,這點真的很不方便。
