今天別人的入庫代碼,看的真有點暈,最后看完才知道是用了sqlldr命令。哎。。。還是學藝不精啊,今后還是要多努力。
總結哈sqlldr命令:雖然大多是網上來的,自己要有體會嘛 !開源就是好啊。
sqlldr是cmd下的命令,用來將文本格式數據導入到數據庫中。
命令格式:
sqlldr username/password@sid control=*.ctl
*.ctl格式為:
load data
infile "d://test.txt" 外部數據文件
infile "d://test1.txt" 可指定多個數據文件
append into table test 向表中追加數據
fields terminated by "," 外部文件的數據以“,”分隔
OPTIONALLY ENCLOSED BY '"' 部分字段可以用雙引號包起來
trailing nullcols 表中的字段沒有對應的值時填充空值
(
id integer external, integer external 表示插入的數據是string,如果只保留integer,表示插入的數據是二進制
name "upper(:name)", 將插入的值轉換為大寫
con ":id||:name", 表中CON列的值是ID和NAME的組合值
dt date"yyyy-mm-dd" 插入日期型數據
)
說明:
load data
告訴SQLLDR要做什么(在這個例子中,則指示要加載數據)。SQLLDR還可以執行CONTINUE_LOAD,也就是繼續加載。只有在繼續一個多表直接路徑加載時才能使用后面這個選項
INFILE * :如果是*號,這會告訴SQLLDR所要加載的數據實際上包含在控制文件本身上,例見下一文。如上例指定包含數據的另一個文件的文件名。如果願意,可以使用一個命令行參數覆蓋這個INFILE語句。要當心,命令行選項總會涵蓋控制文件設置
在append的位置還可以用以下列表中的一個值:
insert 向表中插入值,但要求表開始時為空,默認的加載選項
replace delete表中的數據,然后插入新值,記錄多時速度慢
append 向表中追加數據
truncate trunctate表,然后插入新值,不能回退
FIELDS TERMINATED BY ‘,’:告訴SQLLDR數據的形式應該是用逗號分隔的值。為SQLLDR描述輸入數據的方式有數十種;這只是其中較為常用的方法之一。
TERMINATED BY WHITESPACE會解析這個串,查找空白符(制表符、空格和換行符)的第一次出現,然后繼續查找,直至找到下一個非空白符。
(id integer external,
.....
dt date"yyyy-mm-dd"):告訴SQLLDR所要加載的列、這些列在輸入數據中的順序以及數據類型。這是指輸入流中數據的數據類型,而不是數據庫中的數據類型。列的數據類型默認為CHAR(255)
加載這樣的定界數據時,很可能想逃過輸入記錄中的某些列。例如,你可能加載字段1、3和5,而跳過第2列和第4列。為此,SQLLDR提供了FILLER關鍵字。這允許你映射一個輸入記錄中的一列,但不把它放在數據庫中。
例:
C:\>sqlldr scott/tiger control=d:/dept.ctl log=d:/sqlldr.log
dept.ctl的內容如下:
load date
infile "d://test.txt"
append into table tt
fields terminated by ","
trailing nullcols
(
id integer external,
name "upper(:name)",
con ":id||:name",
dt date"yyyy-mm-dd"
)
test.txt的數據如下
1,a,,2007-07-8
2,b,,2008-07-8
3,c,,2009-07-8
附錄:有效的關鍵字:方便今后使用和查詢。
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'
的位置正確。