|
控制文件是SQL*Loader里最重要的文件,它是一個(gè)文本文件,用來定義數(shù)據(jù)文件的位置、數(shù)據(jù)的格式、以及配置數(shù)據(jù)加載過程的行為,在sqlldr中以control參數(shù)指定控制文件。 在控制文件里配置命令行參數(shù) (OPTIONS)在上一篇中我們講過命令行參數(shù)可以配置在三個(gè)地方,其中一個(gè)就是可以使用控制文件的OPTIONS字句(這也是最常用的方式),如下所示: OPTIONS (DIRECT=true, SILENT=(ERRORS, FEEDBACK) ) 更多的命令行參數(shù),請見上一篇。 配置數(shù)據(jù)文件(INFILE)
使用INFILE可以配置一個(gè)或多個(gè)數(shù)據(jù)文件,其語法如下: 如果數(shù)據(jù)包含在控制文件本身,則用*表示,如: INFILE *在控制文件的末尾,以BEGINDATA開頭,后面接數(shù)據(jù):
BEGINDATA data 如果你有多個(gè)數(shù)據(jù)文件怎么辦?很簡單,只要多個(gè)INFILE即可,而且還可以為每個(gè)INFILE指定各自的錯(cuò)誤文件和丟棄文件等,如下所示: INFILE mydat1.dat BADFILE mydat1.bad DISCARDFILE mydat1.dis INFILE mydat2.dat INFILE mydat3.dat DISCARDFILE mydat3.dis INFILE mydat4.dat DISCARDMAX 10 0 字符集如果數(shù)據(jù)文件的字符集和數(shù)據(jù)庫的字符集不一樣,SQL*Loader會(huì)自動(dòng)把數(shù)據(jù)文件的字符集轉(zhuǎn)換成數(shù)據(jù)庫的字符集,當(dāng)然前提條件是數(shù)據(jù)庫的字符集是數(shù)據(jù)文件的字符集的超集。數(shù)據(jù)庫的字符集可以通過以下SQL語句查詢:
CHARACTERSET char_set_name如果沒有設(shè)置CHARACTERSET參數(shù),數(shù)據(jù)文件的字符集由操作系統(tǒng)的NLS_LANG設(shè)置。 受到字符集影響的數(shù)據(jù)類型有:CHAR,VARCHAR,numeric EXTERNAL, datetime, interval 還有一種字符集要特別注意,就是控制文件本身的字符集(只能由NLS_LANG設(shè)置),如果控制文件的字符集和數(shù)據(jù)文件的不一樣,會(huì)先轉(zhuǎn)換成數(shù)據(jù)文件的字符集,但這樣很容易出錯(cuò)(特別是分隔符),因此,實(shí)際使用中為了方便,一般把NLS_LANG,CHARACTERSET(如果有的話)設(shè)成和數(shù)據(jù)庫字符集一樣。 數(shù)據(jù)加載方式(INSERT, APPEND, REPLACE, TRUNCATE)默認(rèn)情況下,SQL*Loader是以INSERT方式加載數(shù)據(jù),目標(biāo)表必須是空表,否則會(huì)報(bào)錯(cuò); 如果目標(biāo)表為非空表,則必須指定如下的三種方式之一: 1. APPEND:添加數(shù)據(jù)至源數(shù)據(jù)的后面 2. REPLACE:在添加數(shù)據(jù)之前,先執(zhí)行DELETE FROM TABLE把表清空,注意:這里的REPLACE是表級(jí)別的替代,而不是行級(jí)別 3. TRUNCATE:在添加數(shù)據(jù)之前,先執(zhí)行TRUNCATE TABLE table_name REUSE STORAGE 從上面我們可以知道,SQL*Loader不支持對已存在的行更新,如果你想更新已存在的行,則必須先把數(shù)據(jù)加載至一個(gè)空的中間表,然后在原表和中間表進(jìn)行關(guān)聯(lián)update 如果你想把記錄插入到多個(gè)表中,可以使用多個(gè)INTO TABLE,舉個(gè)例子: 1 50 Manufacturing — DEPT record 2 1119 Smith 50 — EMP record 2 1120 Snyder 50 1 60 Shipping 2 1121 Stevens 60 數(shù)據(jù)文件如上所示,根據(jù)第一列的值插入到不同的表中:
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) |
|
|