sqlloaderoracle
SQL*LOADER是大型數據
倉庫選擇使用的載入方法 因為它提供了最快速的途徑(DIRECT PARALLEL) 現在 我們拋開其理論不談 用實例來使
您快速掌握SQL*LOADER的使用方法
首先 我們認識一下SQL*LOADER
在NT下 SQL*LOADER的命令為SQLLDR 在UNIX下一般為sqlldr/sqlload
如執行 d:oracle>sqlldr
SQL*Loader: Release Proction on 星期二 月 : :
(c) Copyright Oracle Corporation All rights reserved
用法: SQLLOAD 關鍵字 = 值 [ keyword=value ]
有效的關鍵字:
userid ORACLE username/password
control Control file name
log Log file name
bad Bad file name
data Data file name
discard Discard file name
discardmax Number of discards to allow (全部默認)
skip Number of logical records to skip (默認 )
load Number of logical records to load (全部默認)
errors Number of errors to allow (默認 )
rows Number of rows in conventional path bind array or beeen direct p
ath data saves
(默認: 常規路徑 所有直接路徑)
bindsize Size of conventional path bind array in bytes(默認 )
silent Supdivss messages ring run (header feedback errors discards part
扮伏itions)
鬧坦direct use direct path液缺桐 (默認FALSE)
parfile parameter file: name of file that contains parameter specification
s
parallel do parallel load (默認FALSE)
file File to allocate extents from
skip_unusable_indexes disallow/allow unusable indexes or index partitions(默認FALSE)
skip_index_maintenance do not maintain indexes mark affected indexes as unusable(默認FALSE)
mit_discontinued mit loaded rows when load is discontinued(默認FALSE)
readsize Size of Read buffer (默認 )
PLEASE NOTE: 命令行參數可以由位置或關鍵字指定
前者的例子是 sqlload scott/tiger foo ;
後者的例子是 sqlload control=foo userid=scott/tiger
位置指定參數的時間必須早於但不可遲於由關鍵字指定的參數 例如
SQLLOAD SCott/tiger control=foo logfile=log
但 不允許 sqlload scott/tiger control=foo log
即使允許參數 log 的位置正確
d:oracle>
我們可以從中看到一些基本的幫助信息 這里 我用到的是中文的WIN ADVSERVER
我們知道 SQL*LOADER只能導入純文本 所以我們現在開始以實例來講解其用法
一 已存在數據源result csv 欲倒入ORACLE中FANCY用戶下
result csv內容
默認 Web 站點 : : RUNNING
other : : STOPPED
third : : RUNNING
從中 我們看出 列 分別以逗號分隔 為變長字元串
二 制定控制文件result ctl
result ctl內容
load data
infile result csv
into table resultxt
(resultid char terminated by
website char terminated by
ipport char terminated by
status char terminated by whitespace)
說明
infile指數據源文件這里我們省略了默認的discardfile result dsc badfile result bad
into table resultxt 默認是INSERT 也可以into table resultxt APPEND為追加方式 或REPLACE
terminated by 指用逗號分隔
terminated by whitespace結尾以空白分隔
三 此時我們執行載入
D:>sqlldr userid=fancy/testpass control=result ctl log=resulthis out
SQL*Loader: Release Proction on 星期二 月 : :
(c) Copyright Oracle Corporation All rights reserved
SQL*Loader : 在描述表RESULTXT時出現錯誤
ORA : 對象 RESULTXT 不存在
提示出錯 因為資料庫沒有對應的表
四 在資料庫建立表
create table resultxt
(resultid varchar ( )
website varchar ( )
ipport varchar ( )
status varchar ( ))
/
五 重新執行載入
D:>sqlldr userid=fancy/k i l l control=result ctl log=resulthis out
SQL*Loader: Release Proction on 星期二 月 : :
(c) Copyright Oracle Corporation All rights reserved
達到提交點 邏輯記錄計數
達到提交點 邏輯記錄計數
已經成功!我們可以通過日誌文件來分析其過程 resulthis out內容如下
SQL*Loader: Release Proction on 星期二 月 : :
(c) Copyright Oracle Corporation All rights reserved
控制文件: result ctl
數據文件: result csv
錯誤文件: result bad
廢棄文件: 未作指定
:
(可廢棄所有記錄)
裝載數: ALL
跳過數:
允許的錯誤:
綁定數組: 行 最大 位元組
繼續: 未作指定
所用路徑: 常規
表RESULTXT
已載入從每個邏輯記錄
插入選項對此表INSERT生效
列名 位置 長度 中止 包裝數據類型
RESULTID FIRST * CHARACTER
WEBSITE NEXT * CHARACTER
IPPORT NEXT * CHARACTER
STATUS NEXT * WHT CHARACTER
表RESULTXT:
行載入成功
由於數據錯誤 行沒有載入
由於所有 WHEN 子句失敗 行沒有載入
由於所有欄位都為空的 行沒有載入
為結合數組分配的空間: 位元組( 行)
除綁定數組外的內存空間分配: 位元組
跳過的邏輯記錄總數:
讀取的邏輯記錄總數:
拒絕的邏輯記錄總數:
廢棄的邏輯記錄總數:
從星期二 月 : : 開始運行
在星期二 月 : : 處運行結束
經過時間為: : :
CPU 時間為: : : (可
六 並發操作
sqlldr userid=/ control=result ctl direct=true parallel=true
sqlldr userid=/ control=result ctl direct=true parallel=true
sqlldr userid=/ control=result ctl direct=true parallel=true
當載入大量數據時(大約超過 GB) 最好抑制日誌的產生
SQL>ALTER TABLE RESULTXT nologging;
這樣不產生REDOLOG 可以提高效率 然後在CONTROL文件中load data上面加一行 unrecoverable
此選項必須要與DIRECT共同應用
在並發操作時 ORACLE聲稱可以達到每小時處理 GB數據的能力!其實 估計能到 - G就算不錯了 開始可用結構
相同的文件 但只有少量數據 成功後開始載入大量數據 這樣可以避免時間的浪費
我的示例
一 在資料庫建立表格weather如下
create table weather(
outlook varchar( )
temperature float
humidity float
windy varchar( )
play varchar( )
)
二 在F盤建立兩個文件 分別如下
# result ctl內容如下
load data
infile result csv
into table weather
(outlook char terminated by
temperature char terminated by
humidity char terminated by
windy char terminated by
play char terminated by
)
# result csv內容如下
sunny FALSE no
sunny TRUE no
overcast FALSE yes
rainy FALSE yes
rainy FALSE yes
rainy TRUE no
overcast TRUE yes
sunny FALSE no
sunny FALSE yes
rainy FALSE yes
sunny TRUE yes
overcast TRUE yes
overcast FALSE yes
rainy TRUE no
三 命令行下執行
F:>sqlldr userid=cq *** /ctbujx control=result ctl
lishixin/Article/program/Oracle/201311/18602
❷ 如何使用sqlloader導入xml文件到Oracle資料庫
在Oracle表數據和xml文件間相互導入導出的PL/SQL過程
學校里要求做個題,題目要求是寫出將已知格式xml文件中的數據導入Oracle資料庫、把資料庫中的數據導出成xml文件的過程。
已知格式xml文件如下:
<?xmlversion="1.0"?>
<PEOPLE>
<PERSONPERSONID="E01">
<NAME>TonyBlair</NAME>
<ADDRESS>10DowningStreet,London,UK</ADDRESS>
<TEL>(061)98765</TEL><FAX>(061)98768</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
<PERSONPERSONID="E02">
<NAME>BillClinton</NAME>
<ADDRESS>WhiteHouse,USA</ADDRESS>
<TEL>(001)640098765</TEL><FAX>(001)640098769</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
<PERSONPERSONID="E03">
<NAME>TomCruise</NAME>
<ADDRESS>57JumboStreet,NewYork,USA</ADDRESS>
<TEL>(001)450067859</TEL><FAX>(001)450067895</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
<PERSONPERSONID="E04">
<NAME>LindaGoodman</NAME>
<ADDRESS>78CraxLane,London,UK</ADDRESS>
<TEL>(061)5456789</TEL><FAX>(061)5456772</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
</PEOPLE>
於是寫出過程如下:
--建表
CREATETABLEPEOPLE
(
PERSONIDVARCHAR2(10)PRIMARYKEY,
NAMEVARCHAR2(20),
ADDRESSVARCHAR2(60),
TELVARCHAR2(20),
FAXVARCHAR2(20),
EMAILVARCHAR2(40)
);
--從xml文件載入數據保存到資料庫的過程
createorreplaceprocerexml2db(xmlfilevarchar2)as
pxmlparser.Parser;
docxmldom.DOMDocument;
nxmldom.DOMNode;
nlxmldom.DOMNodeList;
lennumber;
--根據PERSON結點生成插入SQL語句的過程
functioninsertsql(nodexmldom.DOMNode)returnvarchar2
is
nxmldom.DOMNode;
nlxmldom.DOMNodeList;
lennumber;
nnmxmldom.DOMNamedNodeMap;
isqlvarchar2(200);
begin
--取得PERSON結點所有屬性
nnm:=xmldom.getAttributes(node);
isql:='insertintopeoplevalues(';
isql:=isql||'''';
--取得所有屬性中的第一個屬性,即"PERSONID",並拼接到SQL語句中
isql:=isql||xmldom.getNodeValue(xmldom.item(nnm,0));
isql:=isql||'''';
--取得PERSON結點下的所有結點,准備遍歷
nl:=xmldom.getChildNodes(node);
len:=xmldom.getLength(nl);
foriin0..len-1loop
--取出第i個結點
n:=xmldom.item(nl,i);
isql:=isql||',';
isql:=isql||'''';
--將結點的文本值取出並拼接到SQL語句中
isql:=isql||xmldom.getNodeValue(xmldom.getFirstChild(n));
isql:=isql||'''';
endloop;
isql:=isql||')';
returnisql;
endinsertsql;
begin
p:=xmlparser.newParser;
xmlparser.parse(p,xmlfile);
--轉換xml文件成DOM對像
doc:=xmlparser.getDocument(p);
xmlparser.freeParser(p);
--取出所有PERSON元素
nl:=xmldom.getElementsByTagName(doc,'PERSON');
len:=xmldom.getLength(nl);
--清空people表的內容
deletefrompeople;
foriin0..len-1loop
--取出第i個PERSON元素
n:=xmldom.item(nl,i);
--執行插入該PERSON元素所用的SQL語句
executeimmediateinsertsql(n);
endloop;
commit;
xmldom.freeDocument(doc);
endxml2db;
/
--將資料庫中的數據導出成xml文件的過程
createorreplaceproceredb2xml(xmlfilevarchar2)as
docxmldom.DOMDocument;
retxmldom.DOMNode;
peoplenodexmldom.DOMNode;
--遍歷整個people表的游標
-------------
--將people表中一行記錄轉換為元素
--並插入到DOM文檔對像根結點PEOPLE下的過程
procereaddperson(docxmldom.DOMDocument,peoplexmldom.DOMNode,
v_pidvarchar2,v_namevarchar2,v_addrvarchar2,
v_telvarchar2,v_faxvarchar2,v_emailvarchar2)
is
personelemxmldom.DOMElement;
personnodexmldom.DOMNode;
itemelemxmldom.DOMElement;
itemnodexmldom.DOMNode;
textxmldom.DOMText;
begin
--創建PERSON結點
personelem:=xmldom.createElement(doc,'PERSON');
--設置PERSONID屬性
xmldom.setAttribute(personelem,'PERSONID',v_pid);
personnode:=xmldom.appendChild(peoplenode,xmldom.makeNode(personelem));
--向PERSON結點中添加NAME元素
itemelem:=xmldom.createElement(doc,'NAME');
--將NAME結點添加到PERSON結點中
itemnode:=xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
--創建文本結點
text:=xmldom.createTextNode(doc,v_name);
--將文本結點添加到NAME結點下,以構成完整NAME元素
itemnode:=xmldom.appendChild(itemnode,xmldom.makeNode(text));
--向PERSON結點中添加ADDRESS元素
itemelem:=xmldom.createElement(doc,'ADDRESS');
itemnode:=xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
text:=xmldom.createTextNode(doc,v_addr);
itemnode:=xmldom.appendChild(itemnode,xmldom.makeNode(text));
--向PERSON結點中添加TEL元素
itemelem:=xmldom.createElement(doc,'TEL');
itemnode:=xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
text:=xmldom.createTextNode(doc,v_tel);
itemnode:=xmldom.appendChild(itemnode,xmldom.makeNode(text));
--向PERSON結點中添加FAX元素
itemelem:=xmldom.createElement(doc,'FAX');
itemnode:=xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
text:=xmldom.createTextNode(doc,v_fax);
itemnode:=xmldom.appendChild(itemnode,xmldom.makeNode(text));
--向PERSON結點中添加EMAIL元素
itemelem:=xmldom.createElement(doc,'EMAIL');
itemnode:=xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
text:=xmldom.createTextNode(doc,v_email);
itemnode:=xmldom.appendChild(itemnode,xmldom.makeNode(text));
endaddperson;
begin
--創建一個新DOM文檔對像
doc:=xmldom.newDOMDocument;
--為文檔添加根結點PEOPLE
peoplenode:=xmldom.makeNode(xmldom.createElement(doc,'PEOPLE'));
ret:=xmldom.appendChild(xmldom.makeNode(doc),peoplenode);
--使用游標遍歷people中的每行,生成每一行對應的PERSON元素並添加到PEOPLE根結點中
forv_rowincur_peopleloop
addperson(doc,peoplenode,v_row.personid,v_row.name,
v_row.address,v_row.tel,v_row.fax,v_row.email);
endloop;
--將結果寫入指定文件
xmldom.writeToFile(doc,xmlfile);
xmldom.freeDocument(doc);
enddb2xml;
❸ Oracle資料庫不在本地怎麼使用sqlloader
sqlloader的使用與Oracle資料庫是否在本地無關。前提是本地必須裝有Oracle客戶端。
使用Oracle版本:Oracle10g。
步驟:
1、配置本地連接遠程資料庫。在Oracle安裝目錄下,如「C:oracleproct10.2.0db_1 etworkADMIN」找到tnsnames.ora文件,增加內容(中文部分需要根據實際情況修改)並保存:
本地實例名(可自定義英文+數字組合)=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=伺服器IP或伺服器主機名)(PORT=Oracle埠號))
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=資料庫服務名)
)
)
2、根據本地的要sqlloader的腳本在資料庫中建立相應的表,數據舉例如下:
❹ 如何使用SQLloader導入數據
1、打開要導出為oracle的Excel,將Excel文件保存為test.txt文件(文件->另存為)
2、創建SQL*Loader輸入數據所需要的文件,均保存到C:,用記事本編輯:
控制文件:input.ctl,內容如下:
load data--1、控制文件標識
infile 'test.txt' --2、要輸入的數據文件名為.txt,注意路徑
append intotable Table_Name --3、向oracle表中追加記錄
fields terminatedby X'09' --4、欄位終止於X'09',是一個製表符(TAB)
(Col1,Col2…) 定義列對應順序
a、insert,為預設方式,在數據裝載開始時要求表為空
b、append,在表中追加新記錄
c、replace,刪除舊記錄,替換成新裝載的記錄
d、truncate,同上
3、在DOS窗口下使用SQL*Loader命令實現數據的輸入
C:>sqlldr userid=system/managercontrol=input.ctl
默認日誌文件名為:input.log
默認壞記錄文件為:input.bad
4、ok,現在就可以查看數據是否導入了。
ORACLESQL Loader的詳細語法
SQL*LOADER是ORACLE的數據載入工具,通常用來將操作系統文件遷移到ORACLE資料庫中。SQL*LOADER是大型數據倉庫選擇使用的載入方法,因為它提供了最快速的途徑(DIRECT,PARALLEL)。
要使用SQL*Loader,必須編輯一個控制文件(.ctl),及一個數據文件(.dat)
首先,我們認識一下SQL*LOADER
在windows下,SQL*LOADER的命令為SQLLDR,在UNIX下一般為sqlldr/sqlload。
如執行:d:\oracle>sqlldr
用法: SQLLOAD 關鍵字=值 [,keyword=value,...]
例如:>sqlldr user/pass
control=控制文件名 log=日誌文件名
SQL*LOADER參數列表
參數名稱
功能描述
Userid
資料庫用戶名及口令
Control
控制文件名稱,描述數據載入的文件信息
Log
日誌文件名稱,用於記錄數據載入過程的信息
Bad
壞信息文件名稱,用於記錄不符合要求的數據信息
Data
數據文件名稱,記錄要載入的原始數據
Discard
丟掉文件名稱,記載了不滿足條件而被過濾的數據
Discardmax
允許丟掉數據量,默認為全部丟掉
Skip
跳過幾個邏輯記錄,預設為0
Load
要載入的記錄數,默認為全部載入
Errors
允許出現的錯誤數,預設為50
Direct
是否使用直接路徑載入數據,默認為false
Readsize
緩沖區大小默認為1048576位元組
1、首先創建空表
SQL>create table stu(stunonumber(5),name varchar(10),addr
varchar(20));
數據文件格式分為自由格式和固定格式
固定格式數據文件(mydata.txt)
001 SHUI LIAOHE
002 LIU BEIJING
其控制文件分別如下
#Load.ctl
Load data
Infile mydata.txt
Into table stu
(stuno position(01:03) integer external,
Name position(05:08) varchar,
Addr position(10:16) varchar)
導入數據
>sqlldr test1/test1 control=』d:\load.ctl』log=』d:\load.log』
自由格式數據文件(mydata.txt)
003,」shuics」,」new york」
004,」liujianxin」,」Beijing」
005,」shuiym」,」Canada」
其控制文件如下
#load.ctl
Load data
Infile mydata.txt
Append|insert|replace|truncate
Into table stu
Fields terminated by 『,』
Optionally enclosed by 『」』
(stuno,name,addr)
導入數據
將Excel數據載入到oracle資料庫
1、將excel文件另存為文本文件(製表符分隔)
2、創建控制文件如下
Load data
Infile 『book.txt』
Append
Into table stu
Fields terminated by X』09』
(stuno,name,addr)
其中X』09』是一個製表符(TAB)
❺ oracle sqlloader 指定結束符
可以重新指定記錄的結束符號,比如將記錄結束符定義為:|加回車,infile 'test.dat' "str '|\n'"
完整控制文件為:
load data
infile 'test.dat' "str '|\n'"
into table test
fields terminated by ',' optionally enclosed by '"'
(id char(3),
ch char(5)
)
可以導入如下五條記錄
001,abc|
002,def|
003,"g
i"|
004,"jkl"|
005,mno