第一步:寫一個 ctl格式的控制文件
CTL 控制文件的內容 :
load data --1. 控制文件標識 infile 'xxx.txt' --2. 要導入的數據文件名 insert into table test --3. 將文件插入到數據庫的 test 表中 fields terminated by X'09' --4. 用於分割一行中各個屬性值的符號(例如每個屬性值用逗號 分割 , 那么就把 X'09' 改為 ‘ ,’) (id , username ,passwprd ,......) --5. test表中對應的屬性名
load data infile 'E:/user_data_one_week/zhejiang_user_data.log' insert into table day_data fields terminated by '|' trailing nullcols
--(數據中某些屬性可能是 null 值 , 如果不加入這行導入到數據庫的時候就會自動跳過null值的列, 這樣數據插入后就會屬性和值對應不上) (time, user_id, type, longitude, latitude, height, content char(10000))
補充幾點 .
1. 我在第三步中運用了 insert into table還有以下幾個值
a.insert 為缺省方式,插入表中時要求表為空 ,不然會報錯
b.append , 在表中追加新紀錄 , 所以表不為空插入的時候也不會報錯
c.replace , 刪除舊記錄 , 替換成新裝載的記錄 (明明我應該用這種方法 , 但是我對 insert情有獨鍾 ,好吧,我是導入完才看到有這個的)
d .reuncate 同上 (也同上沒用過 )
2.表中屬性 content 的問題 -- CLOB 類型插入問題
當使用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只是隨便用的一個大數字,只要保證加載的長度不超這個數字就成
第二步 : 在 cmd 命令窗口中寫入導入語句
-> sqlldr userid = 用戶名 / 密碼 @ 數據庫名 control = 之前寫的ctl控制文件的地址 bad = E:/ bad.bad log = E:/log.log
-> sqlldr userid = everyday/123456@orcl control = E:/data.ctl bad=E:/bad.bad log = E:/ log.log
oracle sqlldr導入文件只需要兩步
1. 寫CTL 控制文件
2 . 在cmd 命令窗口中寫入導入語句