SQLldr_乔羽简介
1. SQLLDR導入
1.1簡介
SQL*LOADER是ORACLE的數據加載工具,通常用來將操作系統文件(數據)遷移到ORACLE數據庫中。SQL*LOADER是大型數據倉庫選擇使用的加載方法,因為它提供了最快速的途徑(DIRECT,PARALLEL)。
2.2語法和參數
語法: SQLLDR keyword=value [,keyword=value,…];
Sqlldr 參數一覽
|
Keyword |
默認值 |
描述 |
|
userid |
ORACLE用戶名/口令 |
|
|
control |
控制文件名 |
|
|
log |
日志文件名 |
|
|
bad |
錯誤文件名 |
|
|
data |
數據文件名 |
|
|
discard |
廢棄文件名 |
|
|
discardmax |
全部 |
允許廢棄的文件的數目 |
|
skip |
0 |
要跳過的邏輯記錄的數目 |
|
load |
全部 |
要加載的邏輯記錄的數目 |
|
errors |
允許的錯誤的數目 |
|
|
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 |
使用外部表進行加載; |
|
columnarrayrows |
5000 |
直接路徑列數組的行數 |
|
streamsize |
256000 |
直接路徑流緩沖區的大小 (以字節計) |
|
multithreading |
在直接路徑中使用多線程 |
|
|
resumable |
FALSE |
啟用或禁用當前的可恢復會話 |
|
resumable_name |
有助于標識可恢復語句的文本字符串 |
|
|
resumable_timeout |
7200 |
RESUMABLE的等待時間 (以秒計) |
|
date_cache |
1000 |
日期轉換高速緩存的大小 (以條目計) |
3 范例
利用PLSQL生成測試數據cux_sqlldr_test.txt
|
BEGIN FORiIN1..100 LOOP IFMOD(i,2)=1THEN dbms_output.put_line(‘”‘||i||'”,”column1_’||i||'”,’||'”column2_’||i||'”,’||'”column3_’||i||'”,’||'”show_column_’||i||'”,’||'”hide_column_’||i||'”,”2017-01-01″‘); ELSE dbms_output.put_line(‘”‘||i||'”,”column1_’||i||'”, ,’||'”column3_’||i||'”,’||'”show_column_’||i||'”,’||'”hide_column_’||i||'”‘); ENDIF; ENDLOOP; END;
|
建表
|
CREATETABLEcux.cux_sqlldr_test (line_numNUMBER, seq_numNUMBER, column1VARCHAR2(30), column2VARCHAR2(30)NOTNULL, column3VARCHAR2(30)DEFAULT’column2′, show_columnVARCHAR2(30), hide_columnVARCHAR2(30), creation_dateDATE ); CREATEORREPLACESYNONYMapps.cux_sqlldr_testFORcux.cux_sqlldr_test; CREATESEQUENCEcux.cux_sqlldr_test_sSTARTWITH10001; CREATEORREPLACESYNONYMapps.cux_sqlldr_test_sFORcux.cux_sqlldr_test_s; |
Sqlldr 有兩種使用方式
(1) 在控制文件中包涵數據.
創建一個文件命名為cux_sqlldr_test.ctl,在服務器下創建目錄Sqlldr,在sqlldr下創建log和bad文件夾,
上傳cux_sqlldr_test.ctl至服務器 ,如下圖所示:
cux_sqlldr_test.ctl內容如下。
|
OPTIONS (skip=3,rows=128) load data CHARACTERSET ZHS16GBK infile * badfile “/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/bad/cux_sqlldr_test.bad” discardfile “/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/bad/cux_sqlldr_test.disc” TRUNCATE into table cux_sqlldr_test WHEN column1 != “column1_1” Fields terminated by “,” Optionally enclosed by ‘”‘ TRAILING NULLCOLS ( line_num RECNUM , seq_num “cux_sqlldr_test_s.nextval” , column1 , column2 , column3 NULLIF (column3=”column3_4″), show_column “UPPER(:show_column)” , hide_column FILLER , creation_date DATE ‘YYYY-MM-DD’ “CASE WHEN :creation_date is null THEN TO_CHAR(sysdate,’YYYY-MM-DD’) ELSE :creation_date END” ) BEGINDATA “1”,”column1_1″,”column2_1″,”column3_1″,”show_column_1″,”hide_column_1″,”2017-01-01″ “2”,”column1_2″, ,”column3_2″,”show_column_2″,”hide_column_2″ “3”,”column1_3″,”column2_3″,”column3_3″,”show_column_3″,”hide_column_3″,”2017-01-01″ “4”,”column1_4″, ,”column3_4″,”show_column_4″,”hide_column_4″ “5”,”column1_5″,”column2_5″,”column3_5″,”show_column_5″,”hide_column_5″,”2017-01-01″ “6”,”column1_6″, ,”column3_6″,”show_column_6″,”hide_column_6″ “7”,”column1_7″,”column2_7″,”column3_7″,”show_column_7″,”hide_column_7″,”2017-01-01″ “8”,”column1_8″, ,”column3_8″,”show_column_8″,”hide_column_8″ “9”,”column1_9″,”column2_9″,”column3_9″,”show_column_9″,”hide_column_9″,”2017-01-01″ “10”,”column1_10″, ,”column3_10″,”show_column_10″,”hide_column_10″ |
運行命令
sqlldr userid=apps/appsjiahuicontrol=/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/file/cux_sqlldr_test.ctl log=$CUX_TOP/sqlldr/file/cux_sqlldr_test.log
查看結果
查看表
由上圖可以看出,運行命令后,在file文件夾下生成了cux_sqlldr_test.log,在bad下生成了cux_sqlldr_test.bad,在表中生成了3條記錄,下面分析一下cux_sqlldr_test.ctl的內容和結果
|
代碼 |
說明 |
|
OPTIONS (skip=3,rows=128) |
sqlldr的內容可以寫在cotrol文件 |
|
load data |
加載數據 |
|
CHARACTERSET ZHS16GBK |
字符集編碼(如果出現亂碼要考慮一下) |
|
infile* |
加載的文件,*表示本文件 |
|
badfile |
錯誤的數據所放的文件(校驗錯誤) |
|
discardfile |
丟棄的數據放的路徑(記錄的格式錯誤或過濾行) |
|
TRUNCATE into table cux_sqlldr_test |
先TRUNCATE cux_sqlldr_test再將記錄插入表 |
|
WHEN column1 != “column1_1” |
過濾行,對于值為column1_1的行過濾 |
|
Fields terminated by “,” |
多個字段間用“,”隔開 |
|
Optionally enclosed by ‘”‘ |
單個字段用“””,“””開始結束 |
|
TRAILING NULLCOLS |
對于值為空的字段允許為空 |
|
(line_numRECNUM , |
序號,自動生成,并不取自數據 |
|
seq_num“cux_sqlldr_test_s.nextval” , |
取每條記錄的第一個字段,此處應 |
|
代碼 |
說明 |
|
column1 , |
column1 |
|
column2 , |
column2,表定義為非空字段,雖然上面 |
|
column3 NULLIF (column3=”column3_4″), |
column3=”column3_4″時候默認為空 |
|
show_column “UPPER(:show_column)” , |
大寫列(調用UPPER大寫函數) |
|
hide_columnFILLER , |
FILLER隱藏列 |
|
creation_date DATE ‘YYYY-MM-DD’ “CASE WHEN :creation_date is null THEN TO_CHAR(sysdate,’YYYY-MM-DD’) ELSE :creation_date END” |
日期類型,格式為YYYY-MM-DD,為空的時候取系統日期 |
|
) |
|
|
BEGINDATA |
數據開始 |
|
******* |
數據內容,默認每行一條記錄 |
插入表的4種方式
insert,為缺省方式,在數據裝載開始時要求表為空
append,在表中追加新記錄
replace,(delete table) 刪除舊記錄,替換成新裝載的記錄
truncate,(truncate table)刪除舊記錄,替換成新裝載的記錄
10條數據由條件skip=3去除三條,因此上面命令運行結果是logicrecord count 7,查看file文件夾下的log日記(log是不斷疊加的,badfile是重新覆蓋的)
從日志可以看出7條數據中,4條記錄無法沒導入的原因。
查看cux_sqlldr_test.bad,其中記錄4條錯誤的數據。
(2) 在控制文件中不包涵數據.
上傳cux_sqlldr_test.txt,cux_sqlldr_test.ctl至服務器,cux_sqlldr_test.txt由上面PLSQL腳本生成,cux_sqlldr_test.ctl如下
|
OPTIONS (skip=3,rows=128) load data CHARACTERSET ZHS16GBK infile “/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/file/cux_sqlldr_test.txt” badfile “/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/bad/cux_sqlldr_test.bad” discardfile “/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/bad/cux_sqlldr_test.disc” TRUNCATE into table cux_sqlldr_test WHEN column1 != “column1_4” Fields terminated by “,” Optionally enclosed by ‘”‘ TRAILING NULLCOLS ( line_num RECNUM , seq_num “cux_sqlldr_test_s.nextval” , column1 , column2 “nvl(:column2,’***’)”, column3 NULLIF (column3=”column3_4″), show_column “UPPER(:show_column)” , hide_column FILLER , creation_date DATE ‘YYYY-MM-DD’ “CASE WHEN :creation_date is null THEN TO_CHAR(sysdate,’YYYY-MM-DD’) ELSE :creation_date END” ) |
運行命令
sqlldr userid=apps/appsjiahuicontrol=/u02/ebsuat/app/fs2/EBSapps/appl/cux/12.0.0/sqlldr/file/cux_sqlldr_test.ctl log=$CUX_TOP/sqlldr/file/cux_sqlldr_test.log
100條數據由于skip = 3 從第4條開始處理變成97條,第四條數據由于WHEN column1 != “column1_4”
被丟棄在bad的cux_sqlldr_test.disc路徑下,沒有錯誤數據。查看表共96條數據,如下圖所示:
column2 “nvl(:column2,’***’)”, 對于 column2默認為 “***” .
其他
此外,sqlload可以實現同時加載多個文件,同時把數據加載到多個表。
參考網址:
http://www.cnblogs.com/jyzhao/p/4819884.html
http://m635674608.iteye.com/blog/1895316
http://blog.csdn.net/zq9017197/article/details/7352627
總結
以上是生活随笔為你收集整理的SQLldr_乔羽简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计组—指令及寻址
- 下一篇: i2c总线的通信协议(i2c通信协议原理