我的項目有一張表,始終是手動導入數據。我接手之前的同事總是喜歡用pl/sql developer,但是我覺得還是黑框框看着有技術含量。
這里順便就寫一下有關sqlldr的簡單用法。
有關sqlldr資料比較全面的應該就是幫助了,打出來看一下。
SQL*Loader: Release 11.2.0.1.0 - Production on 星期六 8月 4 12:54:31 2012 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 用法: 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' 的位置正確。
好在我是中文版的oracle,看起來很明了。我的目的是把文本文件導入到數據庫中,因此我只需要幾個很簡單的參數。下面是我的數據文件的格式:
xa0010011,88721,201207
xa0010012,88722,201207
......
下面是我的數據表的結構:
create table sqlldr_test
(
user_no varchar2(100),
user_rate number,
month_id varchar2(6)
)。
那么,sqlldr的控制文件應該這樣寫:
load data infile 'E:\Script\data.txt' append into table sqlldr_test fields terminated by ',' trailing nullcols ( user_no, user_rate, month_id )
其中,append代表直接插入到隊尾。append什么原理,可以參考網絡資料。這個我個人認為可以提高導入的速度,因為數據直接插到了數據表的隊尾。另外還有參數:truncate,replace,insert,他們分別和truncate table,delete from table和insert into table對應,前兩個是要刪除數據的慎用。
我的文本文件中,數據是用逗號“,”分割的,所以這里寫上了,這句一定要寫。
trailing nullcols,代表表的字段沒有值時,允許為空。
到此為止,控制文件的寫作就算完成了,已經可以滿足我的應用了。
接下來就要用了。不管是在linux里,還是windows里,都是用命令行來控制的,當然了也可以寫一個程序控制,但是我不會。命令行的命令如下:
sqlldr wings/wings@OBAMA control=control.ctl log=log.log bad=bad.log errors=5000 rows=500
這里面的所有參數在文章最開始的地方已經解釋過了,這里便不再贅述。下面點一下回車就執行了。
我覺得需要說的應該就是rows了,因為從最開始接觸oracle就有人告訴我,每次插入數據的時候,最好每多少多少行提交一次,因為undo空間是有限的。至於每次使用sqlldr的時候多少行提交一次,我想應該根據自己的文件大小決定。
記得記日志,不然錯了你都不知道錯到哪里了。