Oracle 利用跨平臺sqluldr2匯出資料和sqlldr匯入資料
Oracle 利用跨平臺sqluldr2匯出資料和sqlldr匯入資料
Oracle資料匯出工具sqluldr2可以將資料以csv、txt等檔案格式匯出,適用於大批量資料的匯出,匯出速度非常快,匯出後可以使用Oracle SQL Loader(sqlldr)工具將資料匯入到資料庫中。下面將介紹Sqluldr2和sqlldr在Windows平臺下的資料處理過程。
簡介:
Sqluldr2:專業用於大資料量匯出工具之一,效率比普通匯出快70%。 ( Sqlldr:專業用於匯入的工具之一,請注意兩個工具的區別。),在使用時,最好用磁碟寫入速度快,網路好,網速快的做。
工具列表:
針對不同平臺用不同的匯出工具:
Windows: sqluldr2.exe
Linux(32位): sqluldr2_linux32_10204.bin
Linux(64位): sqluldr2_linux64_10204.bin
檔案內容如下圖所示:
二、sqluldr2 使用方法
1、首先將sqluldr2.exe複製到執行目錄下,即可開始使用
2、檢視help 幫助
3、執行資料匯出命令
3.1、常規匯出
sqluldr2 test/[email protected]/orcl query="select * from temp_001" head=yes file=d:\tmp001.csv
說明:head=yes 表示輸出表頭
3.2、使用sql引數
sqluldr2 test/[email protected]/orcl sql=test_sql.sql head=yes file=d:\tmp001.csv
test_sql的內容為:
select * from temp_001
3.3、使用log引數
當整合sqluldr2在指令碼中時,就希望遮蔽上不輸出這些資訊,但又希望這些資訊能保留,這時可以用“LOG”選項來指定日誌檔名。
sqluldr2 test/[email protected]/orcl sql=test_sql.sql head=yes file=d:\tmp001.csv log=+d:\tmp001.log
3.4、使用 table 引數
當使用 table 引數時,在目錄下會生成對應的ctl控制檔案,如下語句會生成temp_001_sqlldr.ctl檔案。
sqluldr2 test/[email protected]/orcl query="select * from temp_001" table=temp_001 head=yes file=d:\tmp001.csv
生成的控制檔案temp_001_sqlldr.ctl的內容如下:
4、主要引數說明
Field 分隔符 指定欄位分隔符,預設為逗號
record 分隔符 指定記錄分隔符,預設為回車換行,Windows下的換行
quote 引號符 指定非數字欄位前後的引號符
例如現在要改變預設的欄位分隔符,用“#”來分隔記錄,匯出的命令如下所示:
sqluldr2 test/test sql=tmp.sql field=#
在指定分隔符時,可以用字元的ASCII程式碼(0xXX,大寫的XX為16進位制的ASCII碼值)來指定一個字元,常用的字元的ASCII程式碼如下:
回車=0x0d,換行=0x0a,TAB鍵=0x09,|=0x7c,&=0x26,雙引號=0x22,單引號=0x27
在選擇分隔符時,一定不能選擇會在欄位值中出現的字元組合,如常見的單詞等,很多次匯入時報錯,回過頭來找原因時,都發現是因為分隔符出現在欄位值中了。
三、sqlldr 使用方法
sqlldr工具可以將文字資料匯入到資料庫表中,
1、檢視sqlldr 的幫助文件
2、建立測試檔案
在D盤根目錄下建立測試檔案tmp_insert.txt ,其內容如下:
PROD_ID,ACC_NUM
18283918,18762535162
12361527,18482762831
3、建立控制檔案tmp_insert01.ctl
內容如下:
options(direct=true,errors=10000000,skip=1)
load data
characterset zhs16gbk
into table temp_001 truncate
fields terminated by ',' optionally enclosed by '"'
trailing nullcols
(
prod_id "trim(:prod_id)",
acc_num "trim(:acc_num)"
)
引數說明:
characterset :字符集, 一般使用字符集 AL32UTF8,如果出現中文字符集亂碼時,改成 ZHS16GBK。
fields terminated by 'string':文字列分隔符。當為tab鍵時,改成'\t',或者 X'09';空格分隔符 whitespace,換行分隔符 '\n' 或者 X'0A';回車分隔符 '\r' 或者 X'0D';預設為'\t'。
optionally enclosed by 'char':欄位包括符。當為 ' ' 時,不把欄位包括在任何引號符號中;當為 "'" 時,欄位包括在單引號中;當為'"'時,欄位在包括雙引號中;預設不使用引用符。
fields escaped by 'char':轉義字元,預設為'\'。
trailing nullcols:表字段沒有對應的值時,允許為空。
insert:為預設方式,在資料裝載開始時要求表為空;
append:在表中追加新記錄 ;
replace:刪除舊記錄,替換成新裝載的記錄 ;
truncate:先清空表,再新增記錄;
skip=1 :表示插入資料時,跳過第一行(標題),從第二行開始匯入;
4、執行資料匯入處理
sqlldr test/[email protected]/orcl data=d:\tmp_insert.txt control=d:\tmp_insert01.ctl log=d:\tmp_insert01.log bad=d:\tmp_insert01.bad
注意:在資料匯入資料庫表後,查詢表資料時,會發現最後一個欄位的資料中含有類似空格的字元,其實不是空格,是回車換行符,通過replace函式將其替換掉即可,如下紅色部分處理
options(direct=true,errors=10000000,skip=1)
load data
characterset zhs16gbk
into table temp_001 truncate
fields terminated by ',' optionally enclosed by '"'
trailing nullcols
(
prod_id char(32) "trim(:prod_id)",
acc_num char(20) "replace(:acc_num,chr(13),'')"
)
5、支援定義的資料型別
可以定義14種資料型別:
CHAR
DATE
DECIMAL EXTERNAL
DECIMAL
DOUBLE
FLOAT
FLOAT EXTERNAL
GRAPHIC EXTERNAL
INTEGER
INTEGER EXTERNAL
SMALLINT
VARCHAR
VARGRAPHIC
a.字元型別資料
CHAR[ (length)] [delimiter]
length預設為 1.
b.日期型別資料
DATE [ ( length)]['date_format' [delimiter]
使用to_date函式來限制。
c.字元格式中的十進位制
DECIMAL EXTERNAL [(length)] [delimiter]
用於常規格式的十進位制數(不是二進位制=> 一個位等於一個bit)。
d.壓縮十進位制格式資料
DECIMAL (digtial [,precision])
e.雙精度符點二進位制
DOUBLE
f.普通符點二進位制
FLOAT
g.字元格式符點數
FLOAT EXTERNAL [ (length) ] [delimiter]
h.雙位元組字串資料
GRAPHIC [ (legth)]
i.雙位元組字串資料
GRAPHIC EXTERNAL[ (legth)]
j.常規全字二進位制整數
INTEGER
k.字元格式整數
INTEGER EXTERNAL
l.常規全字二進位制資料
SMALLINT
m.可變長度字串
VARCHAR
n.可變雙位元組字串資料
VARGRAPHIC
6、常見錯誤示例
SQL*Loader-601: For INSERT option, table must be empty.
這時需要,更改為追加(append)方式載入資料。
建立控制檔案tmp_insert01.ctl,內容如下:
OPTIONS(DIRECT=TRUE,ERRORS=10000000,skip=1)
LOAD DATA
--INFILE 'd:\tmp_insert.txt'
CHARACTERSET AL32UTF8
APPEND INTO TABLE TEMP_001
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
PROD_ID "TRIM(:PROD_ID)",
ACC_NUM "TRIM(:ACC_NUM)"
)
相關文章:
oracle資料遷移快速匯入匯出:利用sqluldr2匯出資料和sqlldr匯入資料的方法