Oracle的SQLLDR用法簡(jiǎn)介
SQLLDR導(dǎo)入
1.簡(jiǎn)介
SQL*LOADER是ORACLE的數(shù)據(jù)加載工具,通常用來(lái)將操作系統(tǒng)文件(數(shù)據(jù))遷移到ORACLE數(shù)據(jù)庫(kù)中。SQL*LOADER是大型數(shù)據(jù)倉(cāng)庫(kù)選擇使用的加載方法,因?yàn)樗峁┝俗羁焖俚耐緩剑―IRECT,PARALLEL)。
2.語(yǔ)法和參數(shù)
語(yǔ)法: SQLLDR keyword=value [,keyword=value,...];
Sqlldr 參數(shù)一覽
Keyword | 默認(rèn)值 | 描述 |
userid | ORACLE 用戶名/口令 | |
control | 控制文件名 | |
log | 日志文件名 | |
bad | 錯(cuò)誤文件名 | |
data | 數(shù)據(jù)文件名 | |
discard | 廢棄文件名 | |
discardmax | 全部 | 允許廢棄的文件的數(shù)目 |
skip | 0 | 要跳過的邏輯記錄的數(shù)目 |
load | 全部 | 要加載的邏輯記錄的數(shù)目 |
errors | 允許的錯(cuò)誤的數(shù)目 | |
rows | 常規(guī):64 默認(rèn)路徑:全部 | 常規(guī)路徑綁定數(shù)組中或直接路徑保存數(shù)據(jù)間的行數(shù) |
bindsize | 256000 | 常規(guī)路徑綁定數(shù)組的大小 |
silent | 運(yùn)行過程中隱藏消息 | |
direct | FALSE | 使用直接路徑 |
parfile | 參數(shù)文件: 包含參數(shù)說明的文件的名稱 | |
parallel | FALSE | 執(zhí)行并行加載 |
file | 執(zhí)行文件 | |
skip_unusable_indexes | FALSE | 不允許/允許使用無(wú)用的索引或索引分區(qū) |
skip_index_maintenance | FALSE | 沒有維護(hù)索引, 將受到影響的索引標(biāo)記為無(wú)用 |
commit_discontinued | FALSE | 提交加載中斷時(shí)已加載的行 |
readsize | 1048576 | 讀取緩沖區(qū)的大小 |
external_table | NOT_USED | 使用外部表進(jìn)行加載; NOT_USED, GENERATE_ONLY, EXECUTE |
columnarrayrows | 5000 | 直接路徑列數(shù)組的行數(shù) |
streamsize | 256000 | 直接路徑流緩沖區(qū)的大小 (以字節(jié)計(jì)) |
multithreading | 在直接路徑中使用多線程 | |
resumable | FALSE | 啟用或禁用當(dāng)前的可恢復(fù)會(huì)話 |
resumable_name | 有助于標(biāo)識(shí)可恢復(fù)語(yǔ)句的文本字符串 | |
resumable_timeout | 7200 | RESUMABLE 的等待時(shí)間 (以秒計(jì)) |
date_cache | 1000 | 日期轉(zhuǎn)換高速緩存的大小 (以條目計(jì)) |
3. 范例
利用PLSQL生成測(cè)試數(shù)據(jù)cux_sqlldr_test.txt
BEGIN ? FOR iIN1..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;
建表
CREATETABLE cux.cux_sqlldr_test (line_num?NUMBER, ?seq_num NUMBER, ?column1 VARCHAR2(30), ?column2 VARCHAR2(30)NOTNULL, ?column3 VARCHAR2(30)DEFAULT'column2', ?show_column VARCHAR2(30), ?hide_column VARCHAR2(30), ?creation_date DATE ); CREATEORREPLACE?SYNONYM apps.cux_sqlldr_test?FOR cux.cux_sqlldr_test; CREATESEQUENCE cux.cux_sqlldr_test_sSTARTWITH10001; CREATEORREPLACESYNONYM apps.cux_sqlldr_test_s FOR cux.cux_sqlldr_test_s;
4.Sqlldr 有兩種使用方式
(1)在控制文件中包涵數(shù)據(jù).
創(chuàng)建一個(gè)文件命名為cux_sqlldr_test.ctl,在服務(wù)器下創(chuàng)建目錄Sqlldr,在sqlldr下創(chuàng)建log和bad文件夾,
上傳cux_sqlldr_test.ctl至服務(wù)器 ,如下圖所示:
cux_sqlldr_test.ctl內(nèi)容如下:
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"
運(yùn)行命令
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
查看結(jié)果
查看表
由上圖可以看出,運(yùn)行命令后,在file文件夾下生成了cux_sqlldr_test.log,在bad下生成了cux_sqlldr_test.bad,在表中生成了3條記錄,下面分析一下cux_sqlldr_test.ctl的內(nèi)容和結(jié)果
代碼 | 說明 |
OPTIONS (skip=3,rows=128) | sqlldr 的內(nèi)容可以寫在cotrol文件load_data的前面,此處跳過前3行,每次提交128行 |
load data | 加載數(shù)據(jù) |
CHARACTERSET ZHS16GBK | 字符集編碼(如果出現(xiàn)亂碼要考慮一下) |
infile * | 加載的文件,* 表示本文件 |
badfile | 錯(cuò)誤的數(shù)據(jù)所放的文件(校驗(yàn)錯(cuò)誤) |
discardfile | 丟棄的數(shù)據(jù)放的路徑(記錄的格式錯(cuò)誤或過濾行) |
TRUNCATE into table cux_sqlldr_test | 先TRUNCATE cux_sqlldr_test再將記錄插入表 |
WHEN column1 != "column1_1" | 過濾行,對(duì)于值為column1_1的行過濾 |
Fields terminated by "," | 多個(gè)字段間用“,”隔開 |
Optionally enclosed by '"' | 單個(gè)字段用“"”,“"”開始結(jié)束 |
TRAILING NULLCOLS | 對(duì)于值為空的字段允許為空 |
(line_num RECNUM | 序號(hào),自動(dòng)生成,并不取自數(shù)據(jù) |
seq_num "cux_sqlldr_test_s.nextval" | 取每條記錄的第一個(gè)字段,此處應(yīng)為1..10,但是這里賦值序列。 |
表2
代碼 | 說明 |
column1 | column1 |
column2 | column2,表定義為非空字段,雖然上面允許為空,但是如果該值為空,不能插入表種 |
column3 NULLIF (column3="column3_4") | column3="column3_4"時(shí)候默認(rèn)為空 |
show_column "UPPER(:show_column)" | 大寫列(調(diào)用UPPER大寫函數(shù)) |
hide_column FILLER | FILLER 隱藏列 |
creation_date DATE 'YYYY-MM-DD'"CASE WHEN :creation_date is null THENTO_CHAR(sysdate,'YYYY-MM-DD') ELSE :creation_date END" | 日期類型,格式為YYYY-MM-DD,為空的時(shí)候取系統(tǒng)日期 |
BEGINDATA | 數(shù)據(jù)開始 |
******* | 數(shù)據(jù)內(nèi)容,默認(rèn)每行一條記錄 |
從日志可以看出7條數(shù)據(jù)中,4條記錄無(wú)法沒導(dǎo)入的原因。
查看cux_sqlldr_test.bad,其中記錄4條錯(cuò)誤的數(shù)據(jù)。
(2)在控制文件中不包涵數(shù)據(jù).
上傳cux_sqlldr_test.txt,cux_sqlldr_test.ctl至服務(wù)器,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" )
運(yùn)行命令
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條數(shù)據(jù)由于skip = 3 從第4條開始處理變成97條,第四條數(shù)據(jù)由于WHEN column1 != "column1_4"
被丟棄在bad的cux_sqlldr_test.disc路徑下,沒有錯(cuò)誤數(shù)據(jù)。查看表共96條數(shù)據(jù),如下圖所示:
column2 "nvl(:column2,'***')", 對(duì)于 column2默認(rèn)為 “***” .
其他
此外,sqlload可以實(shí)現(xiàn)同時(shí)加載多個(gè)文件,同時(shí)把數(shù)據(jù)加載到多個(gè)表。
到此這篇關(guān)于Oracle的SQLLDR用法簡(jiǎn)介的文章就介紹到這了,更多相關(guān)Oracle SQLLDR內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle數(shù)據(jù)遷移MySQL的三種簡(jiǎn)單方法
對(duì)于許多企業(yè)而言,遷移數(shù)據(jù)庫(kù)時(shí)最大的挑戰(zhàn)之一是如何從一個(gè)數(shù)據(jù)庫(kù)平臺(tái)順利遷移到另一個(gè)平臺(tái),下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)遷移MySQL的三種簡(jiǎn)單方法,需要的朋友可以參考下2023-06-06解決ORA-01747:user.table.column,table.column或列說明無(wú)效
這篇文章主要介紹了解決ORA-01747:user.table.column,table.column或列說明無(wú)效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Oracle RMAN還原時(shí)set newname文件名有空格報(bào)錯(cuò)的解決方法
數(shù)據(jù)庫(kù)備份還原是我們?nèi)粘i_發(fā)少不了的一個(gè)功能,但如果一不注意估計(jì)就會(huì)有問題,下面這篇文章主要給大家介紹了關(guān)于Oracle RMAN還原時(shí)set newname文件名有空格報(bào)錯(cuò)的解決方法,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11常見數(shù)據(jù)庫(kù)系統(tǒng)比較 Oracle數(shù)據(jù)庫(kù)
常見數(shù)據(jù)庫(kù)系統(tǒng)比較 Oracle數(shù)據(jù)庫(kù)...2007-03-03oracle數(shù)據(jù)庫(kù)在客戶端建立dblink語(yǔ)法
oracle服務(wù)器沒有建立目標(biāo)數(shù)據(jù)庫(kù)的TNS時(shí),在客戶端(有權(quán)限的情況下)建立dblink語(yǔ)法如下,有需求的朋友可以參考下哈2013-05-05Oracle數(shù)據(jù)庫(kù)tnsnames.ora文件的作用和配置
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)tnsnames.ora文件的作用和配置,tnsnames.ora 是一個(gè)oracle數(shù)據(jù)庫(kù)網(wǎng)絡(luò)配置文件,通過這個(gè)配置文件才能建立對(duì)數(shù)據(jù)庫(kù)的連接,需要的朋友可以參考下2024-06-06