1. 程式人生 > >用SQLLDR來裝載CLOB/BLOB列的控制檔案例子

用SQLLDR來裝載CLOB/BLOB列的控制檔案例子

SQL> create table test(
2 num_col number(10),
3 char_col char(10),
4 var_col varchar2(10),
5 date_col date,
6 blob_col blob,
7 clob_col clob,
8 raw_col raw(20)
9 );

Table Created.

在這個例子中有CLOB/BLOB列, 因此直接模式不能用, 還需要將ROWS引數設為1, 下面是SQLLDR用的控制檔案:

--
-- Generated by AUL/MyDUL, for table hr.test
--
OPTIONS(DIRECT=TRUE,READSIZE=4194304,ERRORS=-1,SKIP=1,ROWS=50000)
LOAD DATA
INFILE 'hr_test.txt' "STR X'0d0a'"
INTO TABLE TEST
FIELDS TERMINATED BY X'7c' TRAILING NULLCOLS 
(
NUM_COL CHAR ,
CHAR_COL CHAR(10) ,
VAR_COL CHAR(10) ,
DATE_COL DATE "YYYY-MM-DD HH24:MI:SS" ,
LOBF_00005 FILLER CHAR(32),
BLOB_COL LOBFILE(LOBF_00005) TERMINATED BY EOF ,
LOBF_00006 FILLER CHAR(32),
CLOB_COL LOBFILE(LOBF_00006) TERMINATED BY EOF ,
RAW_COL CHAR 
)

當然我給的引數肯定不是最好的, 請你試了後告訴我.

當使用sqlldr載入很長的字串(超過4000)到表中的clob型別中時,老是報錯: 資料檔案的欄位超出最大長度.查詢相關資料後得知,sqlldr每次讀入檔案中資料流的資料型別預設為CHAR ,長度為 255 .所以只要超過255字元的段都會報這個錯.解決方法很簡單,在控制檔案中欄位後新增上char(1000000),例如:

LOAD DATA 
INFILE * 
INTO TABLE DEMO 
TRUNCATE 
FIELDS TERMINATED BY ',' 
(d1 ,
d2 char(1000000)
)

其中表demo的列d2是clob型別,當然1000000只是隨便用的一個大數字,只要保證載入的長度不超這個數字就成.

------------------------------------------------------------

首先建立表:

SQL> desc lobdemo
名稱                                      是否為空? 型別
----------------------------------------- -------- ------------

AA01                                      NOT NULL VARCHAR2(10)
AA02                                      NOT NULL BLOB

以下是ctl控制檔案得寫法:檔名為ctldemo.ctl

load data
infile 'dump002.dat'
insert
into table "BTGL"."LOBDEMO1" 
FIELDS TERMINATED BY '|' TRAILING NULLCOLS    
("AA01"                             CHAR(3) enclosed by '|',
LOBFILE_COL1                       FILLER CHAR                     ,
"AA02"                             LOBFILE(LOBFILE_COL1) TERMINATED BY EOF NULLIF LOBFILE_COL1 = 'NONE')

然後在DOS下執行:
sqlldr username/password control=ctldemo.ctl

當時要匯入得是100多萬條,所以我採用了direct方式
c:\>sqlldr username/password control=ctldemo.ctl direct=y

sqlldr也支援多字元分隔符檔案匯入。只要類似fields terminated by "|||"這樣就可以了! 其中|||就是分割符