oracle数据库sqlloader,sql loader ---ORACLE SQLLDR
sql loader的基本使用:
1. sql loader里有幾個概念:
控制文件:和數據庫的文件不是一回事,個人理解是用于數據加載控制的。
數據文件:要加載入庫的數據文件,支持文本,csv, 等格式。 數據文件的內容可以放在控制文件的最后。
×注意:最好數據記錄之間不要有空行,包括數據的最后,否則有可能有些報錯,但是不影響導入。
錯誤文件: 從sql loader中產生,文件名一般為".bad",主要是把一些sql loader無法加載的數據放在這個文件里。
日志文件: 從sql loader中產生,文件名一般為".log", 主要是把數據加載過程中的信息放在這個文件里。
2. 一個使用的例子:
1.SCOTT@orcl> create table t11 (id int, ename varchar2(20), job varchar2(20));
2.
3.Table created.
數據文件:每一行表示一條記錄, 每一個逗號之間的是字段。
1.[milo@milo ~]$ cat data.txt
2.1, milo, dba
3.2, henrry, mobile sw developer
4.3, kail, developer
5.4, sanzo, test engineer
控制文件:
1.[milo@milo ~]$ cat sqlldr.ctl
2.load data
3.infile data.txt
4.truncate into table t11
5.fields terminated by ","
6.(id, ename, job)
由于使用的是truncate,會先把表truncate再加載,truncate的位置還可能是insert(表要為空),append,replace(相當于delete表中數據,然后在insert)。
fields terminated by ","? => 說明使用逗號去分割每個字段
執行數據加載:
之前我們先看下表中的數據
1.SCOTT@orcl> select * from t11;
2.
3.??????? ID ENAME JOB
4.---------- -------------------- --------------------
5.???????? 1 milo dba
執行加載:
1.[milo@milo ~]$ sqlldr scott/tiger control=sqlldr.ctl
2.
3.SQL*Loader: Release 10.2.0.1.0 - Production on Wed Apr 6 07:20:47 2011
4.
5.Copyright (c) 1982, 2005, Oracle. All rights reserved.
6.
7.Commit point reached - logical record count 4
再次查詢如下:數據已經加載到表里
1.SCOTT@orcl> select * from t11;
2.
3.??????? ID ENAME??????????????? JOB
4.---------- -------------------- --------------------
5.???????? 1? milo???????????????? dba
6.???????? 2? henrry?????????????? mobile sw developer
7.???????? 3? kail???????????????? developer
8.???????? 4? sanzo??????????????? test engineer
細心的你也許發現了,我們的分割符是",", 但是數據文件里的數據形式是
1, milo, dba
也就是說每個逗號后,帶有一個空格,這個空格也被加入了數據中。
在這種情況下,terminated by語句是嚴格按照""里內容來的。
所以需要注意數據格式的統一,以及分隔符的嚴謹性。
1.SCOTT@orcl> select ename, length(ename) length from t11;
2.
3.ENAME LENGTH
4.-------------------- ----------
5. milo 5
6. henrry 7
7. kail 5
8. sanzo 6
而且,正如之前提到的如果數據文件有多余的空行,sql loader會把他們看成是非法數據:
我們在第5行加入了一個空行,猶如加入一行非法數據一樣:
1.[milo@milo ~]$ cat -n data.txt
2.???? 1 1, milo, dba
3.???? 2 2, henrry, mobile sw developer
4.???? 3 3, kail, developer
5.???? 4 4, sanzo, test engineer
6.???? 5
注意到count為5.而實際真實數據為4行。
1.[milo@milo ~]$ sqlldr scott/tiger control=sqlldr.ctl
2.
3.SQL*Loader: Release 10.2.0.1.0 - Production on Wed Apr 6 07:36:47 2011
4.
5.Copyright (c) 1982, 2005, Oracle. All rights reserved.
6.
7.Commit point reached - logical record count 5
注意此時,data.bad里放入了一行數據告訴你,此行數據無效。
1.[milo@milo ~]$ cat -n data.bad
2.???? 1
查看log:
[milo@milo ~]$ cat sqlldr.log
SQL*Loader: Release 10.2.0.1.0 - Production on Wed Apr 6 07:42:34 2011
Copyright (c) 1982, 2005, Oracle.? All rights reserved.
Control File:?? sqlldr.ctl
Data File:????? data.txt
Bad File:???? data.bad
Discard File:? none specified
(Allow all discards)
Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:???? 64 rows, maximum of 256000 bytes
Continuation:??? none specified
Path used:????? Conventional
Table T11, loaded from every logical record.
Insert option in effect for this table: TRUNCATE
Column Name????????????????? Position?? Len? Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
ID????????????????????????????????? FIRST???? *?????????? CHARACTER
Terminator string : ', '
ENAME??????????????????????????????? NEXT???? *?????????? CHARACTER
Terminator string : ', '
JOB????????????????????????????????? NEXT???? *?????????? CHARACTER
Terminator string : ', '
Record 5: Rejected - Error on table T11, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Table T11:
4 Rows successfully loaded.
1 Row not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Space allocated for bind array:????????????????? 49536 bytes(64 rows)
Read?? buffer bytes: 1048576
Total logical records skipped:????????? 0
Total logical records read:???????????? 5
Total logical records rejected:???????? 1
Total logical records discarded:??????? 0
Run began on Wed Apr 06 07:42:34 2011
Run ended on Wed Apr 06 07:42:34 2011
Elapsed time was:???? 00:00:00.11
CPU time was:???????? 00:00:00.02
把分隔符也改了下,這下就數據就沒問題了:
1.SCOTT@orcl> select ename, length(ename) length from t11;
2.
3.ENAME LENGTH
4.-------------------- ----------
5.milo 4
6.henrry 6
7.kail 4
8.sanzo 5
總結
以上是生活随笔為你收集整理的oracle数据库sqlloader,sql loader ---ORACLE SQLLDR的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 股票加入高送转板块意味着什么?
- 下一篇: 建行网银证书过期怎么办?