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