使用sqlldr导入文本数据到oracle
1.sqlldr介紹
用法: SQLLDR keyword=value [,keyword=value,...] ? 有效的關鍵字: ? ????userid -- ORACLE 用戶名/口令??????? ???control -- 控制文件名??????????????? ???????log -- 日志文件名??????????????????? ???????bad -- 錯誤文件名?????????????????? ??????data -- 數據文件名????????????????? ???discard -- 廢棄文件名 discardmax -- 允許廢棄的文件的數目???????? (全部默認) ??????skip -- 要跳過的邏輯記錄的數目? (默認 0) ??????load -- 要加載的邏輯記錄的數目? (全部默認) ????errors -- 允許的錯誤的數目???????? (默認 50) ??????rows -- 常規路徑綁定數組中或直接路徑保存數據間的行數 ???????????????(默認: 常規路徑 64, 所有直接路徑) ??bindsize -- 常規路徑綁定數組的大小 (以字節計)? (默認 256000) ????silent -- 運行過程中隱藏消息 (標題,反饋,錯誤,廢棄,分區) ????direct -- 使用直接路徑???????????????????? (默認 FALSE) ???parfile -- 參數文件: 包含參數說明的文件的名稱 ??parallel -- 執行并行加載??????????????????? (默認 FALSE) ??????file -- 要從以下對象中分配區的文件???? skip_unusable_indexes -- 不允許/允許使用無用的索引或索引分區? (默認 FALSE) skip_index_maintenance -- 沒有維護索引, 將受到影響的索引標記為無用? (默認 FALSE) commit_discontinued -- 提交加載中斷時已加載的行? (默認 FALSE) ??readsize -- 讀取緩沖區的大小?????????????? (默認 1048576) external_table -- 使用外部表進行加載; NOT_USED, GENERATE_ONLY, EXECUTE? (默認 NOT_USED) columnarrayrows -- 直接路徑列數組的行數? (默認 5000) streamsize -- 直接路徑流緩沖區的大小 (以字節計)? (默認 256000) multithreading -- 在直接路徑中使用多線程 ?resumable -- 啟用或禁用當前的可恢復會話? (默認 FALSE) resumable_name -- 有助于標識可恢復語句的文本字符串 resumable_timeout -- RESUMABLE 的等待時間 (以秒計)? (默認 7200) date_cache -- 日期轉換高速緩存的大小 (以條目計)? (默認 1000) no_index_errors -- 出現任何索引錯誤時中止加載? (默認 FALSE) ? PLEASE NOTE: 命令行參數可以由位置或關鍵字指定 。前者的例子是 'sqlldr scott/tiger foo'; 后一種情況的一個示例是 'sqlldr control=foo userid=scott/tiger'。位置指定參數的時間必須早于 但不可遲于由關鍵字指定的參數。例如, 允許'sqlldr scott/tiger control=foo logfile=log', 但是 不允許'sqlldr scott/tiger control=foo log', 即使 參數'log'?的位置正確。
2.實戰
先有需求:
將000000_0.txt文件導入oracle數據庫
000000_0.txt大小:123MB,幾十萬行
000000_0.txt內容格式:
20160514|未知|未知|未知|3G|057431041116|55349|41116|28173301261774|460007863660008|1.224609375|13.0|\N|\N
20160514|HTC|手機|D728w|3G|057431001157|55097|1157|35153907023514|460006620667069|0.513671875|10.0|\N|\N
20160514|HTC|手機|D728w|3G|057431043861|55084|43861|35153907033487|460027685036740|2937.208984375|8052.0|\N|\N
20160514|HTC|手機|D728w|3G|057431003011|55084|3011|35153907033487|460027685036740|1.755859375|56.0|\N|\N
導入的數據庫表結構:
2.1編寫控制文件 load.ctl:
load data
CHARACTERSET UTF8 ?//查看下文件的編碼,設為同一個編碼
infile "E:\datafile\000000_0.txt" ? //只能一個個導入,可以把多個文件合并到一個里,然后導入
append
into table TEST201605
fields terminated by '|'
trailing nullcols
(
? ? --"時間",
? ? SHI_JIAN,
? ? ZDCS,
? ? ZDFL,
? ? ZDXH,
? ? XQWLLX,
? ? XQWYBH,
? ? LAC,
? ? CI,
? ? IMEI,
? ? IMSI,
? ? THREEG_LL,
? ? THREEG_SZ,
? ? FOURG_LL
)
2.2 windows下
dos命令窗,cd 到load.ctl所在目錄
使用命令:
sqlldr daily/mdasil@daily-74 control=load.ctl log=log.log bad=bad.log errors=5000 rows=1000 bindsize=10485760
linux:
load data
CHARACTERSET UTF8
infile "/datafile-import/000021_0.txt"
append
into table jingfen_201605_1415
fields terminated by '|'
trailing nullcols
(
? ? SHI_JIAN,
? ? ZDCS,
? ? ZDFL,
? ? ZDXH,
? ? XQWLLX,
? ? XQWYBH,
? ? LAC,
? ? CI,
? ? IMEI,
? ? IMSI,
? ? THREEG_LL,
? ? THREEG_SZ,
? ? FOURG_LL
)
oracle用戶下執行:
sqlldr daily/mdasil control=/datafile-import/ctl/44.ctl log=/datafile-import/log/log20160526.log ?bad=/datafile-import/log/bad20160526.log
rows與bindsize相關,rows默認64行,如果不修改bindsize,只修改rows無效。
bindsize --( 每次提交記錄的緩沖區的大小,字節為單位,默認256000)
dos窗口會打印:
達到提交點 - 邏輯記錄計數 441884
達到提交點 - 邏輯記錄計數 441954
達到提交點 - 邏輯記錄計數 442024
達到提交點 - 邏輯記錄計數 442094
sqllder 導入的時候,不支持中文列名,因為文件里的都是string,導入的表字段也要 字符串 類型 。
(可以控制類型,但是如果數據內容格式不對,導入出錯就比較麻煩,還是以string文本導入后,再修改表結構)
總結
以上是生活随笔為你收集整理的使用sqlldr导入文本数据到oracle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux限制ping的时间,如何限制L
- 下一篇: thrift介绍及应用(四)—hadoo