日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

SQL*Loader 详解

發(fā)布時(shí)間:2025/3/15 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL*Loader 详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在 Oracle 數(shù)據(jù)庫(kù)中,我們通常在不同數(shù)據(jù)庫(kù)的表間記錄進(jìn)行復(fù)制或遷移時(shí)會(huì)用以下幾種方法:

1. A 表的記錄導(dǎo)出為一條條分號(hào)隔開(kāi)的 insert 語(yǔ)句,然后執(zhí)行插入到 B 表中
2. 建立數(shù)據(jù)庫(kù)間的 dblink,然后用 create table?B as select * from?A@dblink?where ...,或 insert into?B select * from?A@dblink?where ...
3. exp A?表,再 imp 到 B 表,exp 時(shí)可加查詢(xún)條件
4. 程序?qū)崿F(xiàn) select from A ..,然后 insert into B ...,也要分批提交
5. 再就是本篇要說(shuō)到的 Sql Loader(sqlldr) 來(lái)導(dǎo)入數(shù)據(jù),效果比起逐條 insert 來(lái)很明顯

第 1 種方法在記錄多時(shí)是個(gè)噩夢(mèng),需三五百條的分批提交,否則客戶(hù)端會(huì)死掉,而且導(dǎo)入過(guò)程很慢。如果要不產(chǎn)生 REDO 來(lái)提高 insert into 的性能,就要下面那樣做:

alter?table?B?nologging;??

insert?/*?+APPEND?*/?into?B(c1,c2)?values(x,xx);??

insert?/*?+APPEND?*/?into?B?select?*?from?A@dblink?where?.....;??

好啦,前面簡(jiǎn)述了 Oracle 中數(shù)據(jù)導(dǎo)入導(dǎo)出的各種方法,一定還有更高明的。下面重點(diǎn)講講 Oracle? 的 Sql Loader (sqlldr) 的用法。

在命令行下執(zhí)行 Oracle??的 sqlldr 命令,可以看到它的詳細(xì)參數(shù)說(shuō)明,要著重關(guān)注以下幾個(gè)參數(shù):

userid?-- Oracle 的 username/password[@servicename]
control?-- 控制文件,可能包含表的數(shù)據(jù)
-------------------------------------------------------------------------------------------------------
log -- 記錄導(dǎo)入時(shí)的日志文件,默認(rèn)為 控制文件(去除擴(kuò)展名).log
bad -- 壞數(shù)據(jù)文件,默認(rèn)為 控制文件(去除擴(kuò)展名).bad
data -- 數(shù)據(jù)文件,一般在控制文件中指定。用參數(shù)控制文件中不指定數(shù)據(jù)文件更適于自動(dòng)操作
errors -- 允許的錯(cuò)誤記錄數(shù),可以用他來(lái)控制一條記錄都不能錯(cuò)
rows -- 多少條記錄提交一次,默認(rèn)為 64
skip -- 跳過(guò)的行數(shù),比如導(dǎo)出的數(shù)據(jù)文件前面幾行是表頭或其他描述

還有更多的 sqlldr 的參數(shù)說(shuō)明請(qǐng)參考:sql loader的用法。

用例子來(lái)演示 sqlldr 的使用,有兩種使用方法:

1. 只使用一個(gè)控制文件,在這個(gè)控制文件中包含數(shù)據(jù)
2. 使用一個(gè)控制文件(作為模板) 和一個(gè)數(shù)據(jù)文件

一般為了利于模板和數(shù)據(jù)的分離,以及程序的不同分工會(huì)使用第二種方式,所以先來(lái)看這種用法。數(shù)據(jù)文件可以是 CSV 文件或者以其他分割符分隔的,數(shù)據(jù)文件可以用 PL/SQL Developer 或者 Toad 導(dǎo)出,也可以用 SQL *Plus 的? spool 格式化產(chǎn)出,或是 UTL_FILE 包生成。另外,用 Toad 還能直接生成包含數(shù)據(jù)的控制文件。

首先,假定有這么一個(gè)表 users,并插入五條記錄:

create?table?users(??????

user_id?number,?????????????--用戶(hù)?ID????

user_name?varchar2(50),?????--用戶(hù)名????

login_times?number,?????????--登陸次數(shù)????

last_login??????????????date--最后登錄日期

);

?

INSERT INTO users
VALUES
?? ?(1,
?? ? 'Unmi',
?? ? 3,
?? ? SYSDATE);
INSERT INTO users
VALUES
?? ?(2,
?? ? NULL,
?? ? 5,
?? ? to_date('2008-10-15', 'YYYY-MM-DD'));
INSERT INTO users
VALUES
?? ?(3,
?? ? '隔葉黃鶯',
?? ? 8,
?? ? to_date('2009-01-02', 'YYYY-MM-DD'));
INSERT INTO users
VALUES
?? ?(4,
?? ? 'Kypfos',
?? ? NULL,
?? ? NULL);
INSERT INTO users
VALUES
?? ?(5,
?? ? '不知秋',
?? ? 1,
?? ? to_date('2008-12-23', 'YYYY-MM-DD'));
第二種方式: 使用一個(gè)控制文件(作為模板) 和一個(gè)數(shù)據(jù)文件

1) 建立數(shù)據(jù)文件,我們這里用 PL/SQL Developer 導(dǎo)出表 users 的記錄為 users_data.csv 文件,內(nèi)容如下:

"???","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN"??

"1"??,"1","Unmi","3","2009-1-5?20:34:44"

"2"??,"2","","5","2008-10-15"

"3"??,"3","隔葉黃鶯","8","2009-1-2"

"4"??,"4","Kypfos","",""

"5","5","不知秋","1","2008-12-23"??
2) 建立一個(gè)控制文件 users.ctl,內(nèi)容如下:

OPTIONS?(skip=1,rows=128)?--?sqlldr?命令顯示的選項(xiàng)可以寫(xiě)到這里邊來(lái),skip=1?用來(lái)跳過(guò)數(shù)據(jù)中的第一行??

LOAD?DATA??INFILE????"users_data.csv"--指定外部數(shù)據(jù)文件,可以寫(xiě)多個(gè)?INFILE?"another_data_file.csv"?指定多個(gè)數(shù)據(jù)文件--這里還可以使用?BADFILE、DISCARDFILE?來(lái)指定壞數(shù)據(jù)和丟棄數(shù)據(jù)--的文件,??

truncate???--操作類(lèi)型,用?truncate?table?來(lái)清除表中原有記錄

INTO???TABLE?users?--?要插入記錄的表

Fields?terminated?????by","--?數(shù)據(jù)中每行記錄用?","?分隔

Optionally?enclosed?by?'"'?--?數(shù)據(jù)中每個(gè)字段用?'"'?框起,比如字段中有?","?分隔符時(shí)????

trailing?nullcols?--表的字段沒(méi)有對(duì)應(yīng)的值時(shí)允許為空

(????virtual_column?FILLER,???--這是一個(gè)虛擬字段,用來(lái)跳過(guò)由?PL/SQL?Developer?生成的第一列序號(hào)??

user_id?number,???--字段可以指定類(lèi)型,否則認(rèn)為是?CHARACTER?類(lèi)型,?log?文件中有顯示??

user_name,????

login_times,????

last_login?????DATE"YYYY-MM-DD?HH24:MI:SS"--?指定接受日期的格式,相當(dāng)用?to_date()?函數(shù)轉(zhuǎn)換

)??

?

說(shuō)明:在操作類(lèi)型 truncate 位置可用以下中的一值:
1) insert???? --為缺省方式,在數(shù)據(jù)裝載開(kāi)始時(shí)要求表為空
2) append? --在表中追加新記錄
3) replace? --刪除舊記錄(用 delete from table 語(yǔ)句),替換成新裝載的記錄
4) truncate --刪除舊記錄(用 truncate table 語(yǔ)句),替換成新裝載的記錄

3) 執(zhí)行命令:

sqlldr?dbuser/dbpass@dbservice?control=users.ctl

在 dbservice 指示的數(shù)據(jù)庫(kù)的表 users 中記錄就和數(shù)據(jù)文件中的一樣了。

執(zhí)行完 sqlldr 后希望能留意一下生成的幾個(gè)文件,如 users.log 日志文件、users.bad 壞數(shù)據(jù)文件等。特別是要看看日志文件,從中可讓你更好的理解 Sql Loader,里面有對(duì)控制文件的解析、列出每個(gè)字段的類(lèi)型、加載記錄的統(tǒng)計(jì)、出錯(cuò)原因等信息。

第一種方式,只使用一個(gè)控制文件在這個(gè)控制文件中包含數(shù)據(jù)

1) 把 users_data.cvs 中的內(nèi)容補(bǔ)到 users.ctl 中,并以 BEGINDATA 連接,還要把 INFILE "users_data.csv" 改為 INFILE *。同時(shí)為了更大化的說(shuō)明問(wèn)題,把數(shù)據(jù)處理了一下。此時(shí),完整的 users.ctl 文件內(nèi)容是:

OPTIONS?(skip=1,rows=128)?--?sqlldr?命令顯示的選項(xiàng)可以寫(xiě)到這里邊來(lái),skip=1?用來(lái)跳過(guò)數(shù)據(jù)中的第一行??

LOAD?DATA??INFILE?*????--?因?yàn)閿?shù)據(jù)同控制文件在一起,所以用?*?表示

append??????--?這里用了?append?來(lái)操作,在表?users?中附加記錄?

INTO?TABLE?users??when???LOGIN_TIMES<>'8'??--?還可以用?when?子句選擇導(dǎo)入符合條件的記錄

Fields?terminated????by","

trailing?nullcols??(????

virtual_column?FILLER,???--跳過(guò)由?PL/SQL?Developer?生成的第一列序號(hào)??

user_id???"user_seq.nextval",?--這一列直接取序列的下一值,而不用數(shù)據(jù)中提供的值??

user_name???"'Hi?'||upper(:user_name)",--,還能用SQL函數(shù)或運(yùn)算對(duì)數(shù)據(jù)進(jìn)行加工處理??

login_times?terminated????by",",?NULLIF(login_times='NULL')?--可為列單獨(dú)指定分隔符??

last_login?????DATE"YYYY-MM-DD?HH24:MI:SS"NULLIF?(last_login="NULL")?--?當(dāng)字段為"NULL"時(shí)就是?NULL)??

BEGINDATA???--數(shù)據(jù)從這里開(kāi)始???

,USER_ID,USER_NAME,LOGIN_TIMES,LAST_LOGIN??

1,1,Unmi,3,2009-1-5?20:34??

2,2,Fantasia,5,2008-10-15??

3,3,隔葉黃鶯,8,2009-1-2??

4,4,Kypfos,??NULL,NULL

5,5,不知秋,1,2008-12-23??

?

2) 執(zhí)行一樣的命令:

sqlldr?dbuser/dbpass@dbservice?control=users.ctl

比如,在控制臺(tái)會(huì)顯示這樣的信息:

C:\>sqlldr?dbuser/dbpass@dbservice?control=users.ctl

SQL*Loader: Release 9.2.0.1.0 - Production on 星期三 1月 7 22:26:25 2009

Copyright (c) 1982, 2002, Oracle Corporation.? All rights reserved.

達(dá)到提交點(diǎn),邏輯記錄計(jì)數(shù)4
達(dá)到提交點(diǎn),邏輯記錄計(jì)數(shù)5

上面的控制文件包含的內(nèi)容比較復(fù)雜(演示目的),請(qǐng)根據(jù)注釋理解每個(gè)參數(shù)的意義。還能由此發(fā)掘更多用法。

最后說(shuō)下有關(guān) SQL *Loader 的性能與并發(fā)操作

1) ROWS 的默認(rèn)值為 64,你可以根據(jù)實(shí)際指定更合適的 ROWS 參數(shù)來(lái)指定每次提交記錄數(shù)。(體驗(yàn)過(guò)在 PL/SQL Developer 中一次執(zhí)行幾條條以上的 insert 語(yǔ)句的情形嗎?)

2)常規(guī)導(dǎo)入可以通過(guò)使用 INSERT語(yǔ)句來(lái)導(dǎo)入數(shù)據(jù)。Direct導(dǎo)入可以跳過(guò)數(shù)據(jù)庫(kù)的相關(guān)邏輯(DIRECT=TRUE),而直接將數(shù)據(jù)導(dǎo)入到數(shù)據(jù)文件中,可以提高導(dǎo)入數(shù)據(jù)的性能。當(dāng)然,在很多情況下,不能使用此參數(shù)(如果主鍵重復(fù)的話(huà)會(huì)使索引的狀態(tài)變成UNUSABLE!)。

3) 通過(guò)指定 UNRECOVERABLE選項(xiàng),可以關(guān)閉數(shù)據(jù)庫(kù)的日志(是否要 alter table table1 nologging 呢?)。這個(gè)選項(xiàng)只能和 direct 一起使用。

4) 對(duì)于超大數(shù)據(jù)文件的導(dǎo)入就要用并發(fā)操作了,即同時(shí)運(yùn)行多個(gè)導(dǎo)入任務(wù).

? sqlldr?? userid=/?? control=result1.ctl?? direct=true?? parallel=true???
? sqlldr?? userid=/?? control=result2.ctl?? direct=true?? parallel=true???
? sqlldr?? userid=/?? control=result2.ctl?? direct=true?? parallel=true??

? 當(dāng)加載大量數(shù)據(jù)時(shí)(大約超過(guò)10GB),最好抑制日志的產(chǎn)生:???
??
? SQL>ALTER?? TABLE?? RESULTXT?? nologging;?
??
? 這樣不產(chǎn)生REDO LOG,可以提高效率。然后在 CONTROL 文件中 load data 上面加一行:unrecoverable,? 此選項(xiàng)必須要與DIRECT共同應(yīng)用。???
??
? 在并發(fā)操作時(shí),ORACLE聲稱(chēng)可以達(dá)到每小時(shí)處理100GB數(shù)據(jù)的能力!其實(shí),估計(jì)能到 1-10G 就算不錯(cuò)了,開(kāi)始可用結(jié)構(gòu) 相同的文件,但只有少量數(shù)據(jù),成功后開(kāi)始加載大量數(shù)據(jù),這樣可以避免時(shí)間的浪費(fèi)。

(注意:一般只能用ASCII碼形式,切記要轉(zhuǎn)換編碼,不然導(dǎo)入數(shù)據(jù)為空)(ftp上傳csv文件的傳輸類(lèi)型選擇ascii)

參考:1.?Oracle SQL*Loader? -- 英文,Sql Loader 的官方使用說(shuō)明,包含多種類(lèi)型的? Demo
??????? 2.?sql loader的用法? --?列出了 sql loader 的選擇參數(shù)的中文說(shuō)明
??????? 3.?使用SQL Loader導(dǎo)入大量數(shù)據(jù),避免使用SQL頻繁寫(xiě)庫(kù)?-- 一個(gè)簡(jiǎn)單的例子,快帶了解 Sql Loader 的用法
??????? 4.?Oracle SQL Loader的詳細(xì)語(yǔ)法
??????? 5.?oracle sql loader全攻略?-- 還算名符其實(shí)。并講了如何用 SQL *Plus 的? spool 或 UTL_FILE 包生成數(shù)據(jù)文件
??????? 6.?SQL*Loader Control File Reference?? -- 英文,控制文件使用參考
??????? 7.?學(xué)習(xí)oracle sql loader 的使用?
??????? 8.?用sqlloader(sqlldr)裝載LOB數(shù)據(jù)? -- LOB 的內(nèi)類(lèi)是一個(gè)外部文件,用 sql loader 導(dǎo)入到數(shù)據(jù)庫(kù)
??????? 9.?SQLLDR直接加載幾個(gè)參數(shù)的測(cè)試
??????? 10.Maximizing SQL*Loader Performance

總結(jié)

以上是生活随笔為你收集整理的SQL*Loader 详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。