1. 程式人生 > >sql loader基礎運用

sql loader基礎運用

數據 mar rmi job to_number 因此 包括 並不是 操作

a.ctl

load data
infile * ---指定加載文件,*表示數據就在控制文件後面
into table bonus ---指定表名
fields terminated by "," ---指定區域分隔符就是逗號
(ename,job,sal) ---指定表的列名
begindata ---僅當infile 指定*時有效
smith,cleak,3904
allen,salesman,2891
ward,salesman,3128
........


以下命令就可以導入
sqlldr userid/pass control=a.ctl


一,要加載的文件不是以逗號作分隔


a,修改原始數據,將分隔符替換成逗號
b,修改控制文件,將fields terminated by 的值修改成實際的分隔符


二,要加載的數據中包含分隔符怎麽辦,如下表kkk.dat
smith,cleak,3904
allen,"salesman,"ak"",2891
ward,"salesman,M",3128
這個時候就要修改控制文件
load data
infile kkk.dat    ---指定加載文件, *表示數據就在控制文件後面
into table bonus ---指定表名
fields terminated by "," optinonally enclosed by ‘ " ‘      ---指定區域分隔符就是逗號
(ename,job,sal) ---指定表的列名

optinonally enclosed by ‘ " ‘ 默認就是雙引號,如果是其他的,把雙引號更改就可以了



三,數據文件沒有分隔符怎麽辦,是定長字符串kkk,dat

smith cleak 3904
allen salesman 2891
ward salesman 3128
修改控制文件
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5), position(1:5)指的是從第一個字符載止到第五個字符作為ename的值,絕對偏移量
job position(7:15),
sal position(17:20)
)

position(*+2:15) ,相對偏移量, 表示從上一個位置結束後偏移二個開始取字符,載止到實際第15個字符
position(*)char(9) 相對偏移量+類型和長度的優勢在於,你只需要為第一列指定開始位置,其他的只需要指定列長度就可以了


四,數據文件中的列比要導入的表的列少,且空列又必須賦值

如bonus中多一列comm,並賦初始值0,則可以這麽寫
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5),
job position(7:15),
sal position(17:20),
comm ‘0‘
)
如果要輸入特殊值,則可以用函數來解決
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5),
job position(7:15),
sal position(17:20),
comm "substr(:sal,1,1)" 取sal值的第一列,並賦值給comm列
)
當然也可以用pl/sql編寫自定義的函數來賦值



五,數據文件中的列比要導入的表中列多怎麽辦
a,將數據文件中多的列刪除
b,采用過濾,或在控制文件中不錄這列數據
load data
infile kkk.dat
truncate table bonus
(
ename position(1:5),
job position(7:15),
sal position(17:20),
tcol filler position(22:30) , --tcol假設這列不錄入,就過濾掉,或這行根本不出現在控制文件中
)
如果此時數據文件是以分隔符出現的則這樣寫
load data
infile kkk.dat
truncate table bonus
fields terminated by ","
(ename , job ,sal, tcol filler)


六,多個數據文件導同一張表,條件就是這些數據文件的格式要相同
load data
infile kkk.dat
infile kkk2.dat
infile kkk3.dat
truncate table bonus
fields terminated by ","
(ename , job ,sal )


七,同一個數據文件要導入不同的表
bon smith cleak 3904
bon allen saler 2891
mgr king tech 2543
mgr smm admd 3032
要把這裏面的數據導到b和m表
load data
infile kkk.dat
discardfile ldr_case9.dsc
truncate
into table b
when tab=‘bon‘ 如果此處判斷關鍵字有多個,只能用and,不能用or
(tab filler position(1:3),
ename position(5:9),
job position(*+1:18),
sal position(*+1)
)
into table m
when tab=‘mgr‘
(tab filler position(1:3),
ename position(5:9),
job position(*+1:18),
sal position(*+1)
)



八,數據文件前n行不導入
sqlddr scott/scott control=ldr_case1.ctl skip=3 意思前三行不導入,從第四行工始
sqlddr scott/scott control=ldr_case1.ctl skip=3 load=6 前三行不導入,導入接下來的6行


九,要加載的數據中有換行符
手工指定的換行符,數據文件的換行符並不是標準的換行標誌,而是用戶自定義的一個標識字符或多個字符組成,
10, smith,sales amnager,this is amith,\nhe is a sales manager.
11, allen.w,tech manager,this is allen.w.\nhe is a tech manager.
16, blake,hr manager,this is blake.\nhe is a hr manager.
控制文件的寫法
load data
infile ldr_case11_1.dat
truncate into table manager
fields terminated by ","
( mgrno,mname,job,
remark "replace(:remark,‘\\n‘,chr(10))"
)
如果數據文件是定長字符呢.
smith sales manager this is smith
he is a sales manager
allenw tech manager this is allen w
he is a tech manager.
blake hr manager this is blake
he is a hr manager.
load data infile ldr_case11_2.dat "fix 68" 就是加載文件之前,先通過fix值屬性指定每行的長度,這裏每行68個字符包括換行符在內,
到了指定長度就換行,不管中間有沒有換行符,因此僅能用於定長字符串的數據文件,
因為只有字符串定長,你才知道應該在infile處指定什麽值
truncate into table manager
(
ename position(1:8),
job position(10:16),
zhiwei position(*+1:22),
remark position(*+1:65)
)
windows中換行實際上由二個字符組成,回車加換行 chr(13)+chr(10), linux/unix下只需一個字符chr(10)即可
char_string:普通字符,即標準的可見字符,
\n,表示換行, \t 表示行制表符, \f 表示換頁 \v 表示列制表符 \r 表示回車
windows下用\r\n linux/unix下用\n就可以了
行尾部換行標識例:
數據文件
10,smith,sales manager,this is smith.
he is a sales manager. |
11,allen.w,tech manager,this is allen.w.
he is a tech manager. |
控制文件
load data
infile ldr_case1_4.dat "str ‘ | \r\n"
truncate into table manager
fields terminated by ‘,‘
(mgrno,maname,job,remarek)


十,要導入大字段(lob類型)
1,數據保存在數據文件中
load data
infile ldr_case12_1.dat "str ‘|\r\n‘"
truncate into table manager
fields terminated by "," optionally enclosed by ‘"‘,
(mgrno,mname,job,remark char(10000))
假定remark列有大量文本,就可以這麽定義
2,數據文件保存在獨立的文件中
SQL> create table lobtbl(
2 fileowner varchar2(30),
3 filename varchar2(200),
4 filesize number,
5 filedata clob,
6 create_date date);
數據文件如下 ldr_case12_2.dat
2009-03-17 09:43 154 junsansi f:\oracle\script\ldr_case11_1.ctl
2009_03_17 09:44 189 junsansi f:\oracle\script\ldr_case11_1.dat
2009_03_17 09:45 2,639 junsansi f:\oracle\script\ldr_case11_4.log
控制文件如下
load date
infile ldr__case12_2.dat
truncate into table lobtbl
(create_date position(1:17) date ‘yyyy-mm-dd hh24:mi‘,
filesize position(*+1:25) "to_number(:filesize, ‘99,999,999‘)",
fileowner position(*+1:34),
filename position(*+1) char(200) "substr(:FILENAME,INSTR(:FILENAME,‘\\‘,-1)+1)",
filedata lobfile(filename) terminated by eof)


十一,某些字段有空值:
load data
infile ldr_case13.dat
truncate into table bonus
fields terminated by "," trailing nullcols
(ename,job,sal)


十二,大量數據的導入
sqlldr scott/scott control=ldr_object.ctl errors=10 rows=640
表示10行出錯就跳出,每次加載640行.默認是64行
如果640行太大,日誌信息裏面有提示,這個時候就要修改bindsize參數,默認就是256k,我們將其修改為10m(
1024X1024X10=10485760)同時這一次將行提高到5000行.
這樣會更快,
sqlldr scott/scott@riso_192.168.1.250 control=ldr_object.ctl errors=10 rows=5000 bindsize=10485760
但還可以更快.
sqlldr scott/scott control=ldr_object.ctl direct=true;
但還可以更快
streamsize:直接路徑加載默認讀取全部記錄, 因此不需要設置rows參數,讀取到的數據處理後存入緩存區,即
streamsize參數,該參數為256k,這裏加大到10mb
date_cache: 該參數指定一個轉換後日期格式的緩存區,以條為單位,默認值1000條,即保存1000條轉換後的日期格式,
由於我們要導入的數據中有日期格式,因此加大該參數到5000,以降低日期轉換操作帶來的開銷.
sqlldr scott/tiger control=ldr_object.ctl direct=true streamsize=10485760 date_cache=5000

sql loader基礎運用