1. 程式人生 > >oracle海量資料快速匯入工具_sqlldr的使用細則

oracle海量資料快速匯入工具_sqlldr的使用細則

標例:
load data                                         
infile *                                              ---指定載入檔案   *表示資料就在控制檔案後面
into table bonus                            ---指定表名
fields terminated by ","                 ---指定區域分隔符就是逗號
(ename,job,sal)                            ---指定表的列名
begindata                                       ---僅當infile 指定*時有效

smith,cleak,3904
allen,salesman,2891
ward,salesman,3128
........

把上術檔案儲存成a.ctl檔案,用如下命令就可以匯入
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/[email protected]_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

相關推薦

oracle海量資料快速匯入工具_sqlldr的使用細則

標例: load data                                          infile *                                              ---指定載入檔案   *表示資料就在控制檔案後面 into table bonus  

Oracle 入門和sqluldr2 資料快速匯出工具的使用

Oracle的安裝 oracle的下載,安裝 請參考: https://www.cnblogs.com/hoobey/p/6010804.html 值得一提的是: 安裝完成,首次啟動Developer的時候,需要制定java.exe的路徑。這個路徑需要選擇oracle安裝目錄

Mysql --學習:大量資料快速匯入匯出

宣告:此文供學習使用,原文:https://blog.csdn.net/xiaobaismiley/article/details/41015783  【實驗背景】 專案中需要對資料庫中一張表進行重新設計,主要是之前未分割槽,考慮到資料量大了以後要設計成分割槽表,同時要對資料庫中其他表做好備份恢

Oracle EBS資料定義移植工具:Xdf(XML Object Description File)

Oracle EBS二次開發中,往往會建立很多資料庫物件,如表、同義詞、檢視等,這些資料庫物件是二次開發配置管理內容很重要的一部分,通常情況下我們會使用指令碼檔案來記錄這些資料庫物件的建立、變更和維護,隨著開發的進行需要對這些物件的指令碼進行版本管理;更重要的是將這些資料

oracle 海量資料轉存插入分割槽表

某普通表T,由於前期設計不當沒有分割槽,如今幾年來的資料量已達9億+, 空間佔用大約350G,線上重定義為分割槽表不現實,故採取申請時間視窗停此表應用,改造為分割槽表。1.建立分割槽表-- Create table 建立分割槽表T_PART,分割槽從14年6月開始。creat

Elasticsearch對Hbase中的資料建索引實現海量資料快速查詢

一、將專案匯入myeclipse中方法1:將下載好的檔案(是解壓es_hbase6資料夾而不是Test-master)解壓到你myeclipse的Workspaces目錄中,然後在myeclipse中右鍵點選Import匯入專案方法2:將下載好的檔案解壓到你的Windows桌

jdbc在操作oracle海量資料的時候用ResultSet獲取所有的返回資料出現記憶體溢位(轉)

來自網路,我在做生成excel的時候也遇到這個吐血問題。 jdbc在操作oracle海量資料的時候用ResultSet獲取所有的返回資料出現記憶體溢位 處理: 出錯的原因是ResultSet用的是可滾動結果集,正常情況下ResultSet是指標指向資料庫的資料,本身是不儲

oracle 利用資料匯入匯出資料

目的:使用資料泵,將一臺電腦上的資料庫匯出,匯入到另一臺電腦上的資料庫。 A電腦上的操作。expdp資料匯出 1、執行cmd; 2、登入資料庫,輸入命令:sqlplus system/密碼; 3、建立目錄路徑:create directory backup_path as 

Linux環境下Oracle exp/imp匯出匯入工具的使用

一. 匯出工具 exp1. 它是作業系統下一個可執行的檔案 存放目錄/ORACLE_HOME/bin   exp匯出工具將資料庫中資料備份壓縮成一個二進位制系統檔案.可以在不同OS間遷移   它有三種模式:       a.  使用者模式: 匯出使用者所有物件以及物件中的資

Excel資料快速匯入mysql的幾個辦法

有時候需要批量插入一批資料到資料庫,有很多種辦法,這裡我用到過三種辦法: 1、通過Excel直接生成insert語句 =CONCATENATE("insert into aisee_pingfen_fengcai(id,order_n,departm

Mysql 大量資料快速匯入匯出

【實驗背景】 專案中需要對資料庫中一張表進行重新設計,主要是之前未分割槽,考慮到資料量大了以後要設計成分割槽表,同時要對資料庫中其他表做好備份恢復的工作。 【實驗環境】 MySQL版本:mysql-5.6.19 作業系統:Ubuntu 12.04

Mysql百萬資料量級資料快速匯入Redis

前言 隨著系統的執行,資料量變得越來越大,單純的將資料儲存在mysql中,已然不能滿足查詢要求了,此時我們引入Redis作為查詢的快取層,將業務中的熱資料儲存到Redis,擴充套件傳統關係型資料庫的服務能力,使用者通過應用直接從Redis中快速獲取常用資料,或者在互動式應用中使用Redis儲存活躍使用者的會話

Hbase通過BulkLoad的方式快速匯入海量資料

摘要 載入資料到HBase的方式有多種,通過HBase API匯入或命令列匯入或使用第三方(如sqoop)來匯入或使用MR來批量匯入(耗費磁碟I/O,容易在匯入的過程使節點宕機),但是這些方式不是慢就是在匯入的過程的佔用Region資料導致效率低下,今天要講的就是利用H

Centos7下Oracle 11g r2 本地/遠端 用exp/imp命令快速匯入匯出資料 實踐筆記

百度統計 [removed] var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.

Oracle中用exp/imp命令快速匯入匯出資料

【用 exp 數 據 導 出】: 1 將資料庫TEST完全匯出,使用者名稱system 密碼manager 匯出到D:\daochu.dmp中    exp system/[email protected] file=d:\daochu.dmp full=y 2

Sphinx 實現海量資料快速查詢

來源:https://blog.csdn.net/qq_28018283/article/details/72622003   說到 Sphinx,就會想到:站內搜尋,mysql優化,分詞 等等有關搜尋海量資料的需求,本文介紹了 sphinx的基本概念

3.MySQL快速匯入資料LOAD DATA INFILE(帶詳細優化引數)

介紹 LOAD DATA INFILE語句以非常高的速度將文字檔案中的行讀入表中。 LOAD DATA INFILE是SELECT … INTO OUTFILE的補充。要將表中的資料寫入檔案,請使用SELECT … INTO OUTFILE。 要將檔案讀回表中,請使用LOAD DATA

Oracle資料庫資料常用的匯入匯出

採用exp/imp命令 知識擴充:   資料泵匯出匯入(EXPDP和IMPDP)的作用    1、實現邏輯備份和邏輯恢復。    2、在資料庫使用者之間移動物件。    3、在資料庫之間移動物件    4、實現表空間搬移。   資料泵匯出匯

oracle資料匯入sqlldr與匯出sqluldr2

1.匯出sqluldr2 oracle資料匯出工具sqluldr2——專業大資料匯出工具,能夠將資料已txt,csv,dbf等格式快速匯出,效率比普通匯出快70%。 根據查詢語句匯出 field=0x3a表示以分號進行欄位隔開 sqluldr2.exe username/pwd query=

talend工具中往oracle資料報ORA-01461: can bind a LONG value only for insert into a LONG colum

今天使用talend往oracle插資料報ORA-01461: can bind a LONG value only for insert into a LONG column 資料來源是mysql,開始以為是數字型別的匹配問題,結果調了好久數字的型別也沒解決。 最終定位到一個型別為text的欄位上 最