詳解Oracle中sqlldr的具體用法
前言
由于最近做一個(gè)項(xiàng)目 , 需要將 .log格式的文本文件導(dǎo)入到 oracle當(dāng)中 。其中遇到過(guò)很多的問(wèn)題 , 網(wǎng)上有許多的例子 ,但是對(duì)于一個(gè)沒(méi)有學(xué)過(guò) oracle 的小白來(lái)說(shuō)還是有一些晦澀。
所以我特意將我找的一些相關(guān)資料進(jìn)行總結(jié)一下 。
首先導(dǎo)入 oracle 的方法有很多 , 對(duì)于不同需求有不同的導(dǎo)入方式 , 我在這里就說(shuō)一下 sqlldr 的方法 。 使用sqlldr 將文本文件導(dǎo)入 oracle中確切說(shuō)只需要兩步 。
第一步: 寫(xiě)一個(gè) ctl 格式的控制文件
CTL 控制文件的內(nèi)容 : (我會(huì)寫(xiě)一個(gè)模板和一個(gè)樣例)
模板 :
load data -- 1. 控制文件標(biāo)識(shí)
infile 'xxx.txt' -- 2. 要導(dǎo)入的數(shù)據(jù)文件名
insert into table test -- 3. 將文件插入到數(shù)據(jù)庫(kù)的 test 表中
fields terminated by X'09' -- 4. 用于分割一行中各個(gè)屬性值的符號(hào)(例如每個(gè)屬性值用逗號(hào) 分割 , 那么就把 X'09' 改為 ‘ ,’)
(id , username ,passwprd ,......) -- 5. test表中對(duì)應(yīng)的屬性名
這五個(gè)內(nèi)容是一個(gè)基本的步驟 , 注意是基本 , 基本 基本 。(重要的事情說(shuō)三遍) , 導(dǎo)入文件的時(shí)候根據(jù)不同的需求會(huì)在不同的地方在添加一些內(nèi)容 , 下面舉一個(gè)我這次項(xiàng)目所導(dǎo)入的內(nèi)容 。
樣例:
load data
infile 'E:/user_data_one_week/zhejiang_user_data.log' -- (我的文件格式是 .log 之前上網(wǎng)查.log文件導(dǎo)入oracle的方法都沒(méi)有人遇到過(guò) , 結(jié)果我試著用文本文件的方法沒(méi)想到可以導(dǎo)入進(jìn)去)
insert into table day_data -- (我的數(shù)據(jù)庫(kù)的表名為 day_data , 其中除了 insert into table 還有其他的寫(xiě)法 , 根據(jù)需求來(lái) , 下面會(huì)詳細(xì)寫(xiě))
fields terminated by '|' --(我的數(shù)據(jù)文件每個(gè)字段也就是屬性是按照 | 來(lái)分割的)
trailing nullcols (這行就是我根據(jù)需求新加入的 , 因?yàn)槲业臄?shù)據(jù)中某些屬性可能是 null 值 , 如果不加入這行導(dǎo)入到數(shù)據(jù)庫(kù)的時(shí)候就會(huì)自動(dòng)跳過(guò)null值的列, 這樣數(shù)據(jù)插入后就會(huì)屬性和值對(duì)應(yīng)不上)
(time, user_id, type, longitude, latitude, height, content char(10000)) (注意 : 我這里的 content 運(yùn)用的類型是 clob , 但是為什么后面加了 char(10000) 下面會(huì)詳細(xì)講 , 也是一些新手會(huì)遇到的問(wèn)題)
上面的樣例就是我這次項(xiàng)目中縮寫(xiě)的 ctl 控制文件 。
CTL 控制文件大概已經(jīng)說(shuō)好了 , 但是補(bǔ)充幾點(diǎn) .
1 . 我在第三步中運(yùn)用了 insert into table 還有以下幾個(gè)值
- insert 為缺省方式 , 插入表中時(shí)要求表為空 , 不然會(huì)報(bào)錯(cuò) (我就是總忘記在插入前清空表 , 每次都是報(bào)錯(cuò)提醒我我才過(guò)去刪除內(nèi)容的 ,吼吼)
- append , 在表中追加新紀(jì)錄 , 所以表不為空插入的時(shí)候也不會(huì)報(bào)錯(cuò)
- replace , 刪除舊記錄 , 替換成新裝載的記錄 (明明我應(yīng)該用這種方法 , 但是我對(duì) insert情有獨(dú)鐘 ,好吧,我是導(dǎo)入完才看到有這個(gè)的)
- reuncate 同上 (也同上沒(méi)用過(guò) )
2 . 也就是我表中屬性 content 的問(wèn)題 -- CLOB 類型插入問(wèn)題
這個(gè)問(wèn)題也困擾了我好久 , 在網(wǎng)上找了好久才解決的 。 下面我來(lái)分享給也受這個(gè)問(wèn)題困擾的小伙伴 , 如果沒(méi)有需求 ,自動(dòng)略過(guò)進(jìn)入下一個(gè)環(huán)節(jié)。
由于數(shù)據(jù)長(zhǎng)度比較大 , 所以表中 content 這個(gè)屬性類型我用了 clob , 但是導(dǎo)入數(shù)據(jù)庫(kù)時(shí)總報(bào)錯(cuò)。(錯(cuò)誤可以在自動(dòng)生成的 log.log文件中查看,下面會(huì)講到)說(shuō)我數(shù)據(jù)長(zhǎng)度超過(guò)了定義類型的最大長(zhǎng)度 , 這時(shí)我就納悶了 , 我已經(jīng)把類型定義為 clob了,為什么還會(huì)超過(guò)最大長(zhǎng)度。
當(dāng)使用sqlldr加載很長(zhǎng)的字符串(超過(guò)4000)到表中的clob類型中時(shí),老是報(bào)錯(cuò): 數(shù)據(jù)文件的字段超出最大長(zhǎng)度.查找相關(guān)資料后得知,sqlldr每次讀入文件中數(shù)據(jù)流的數(shù)據(jù)類型默認(rèn)為CHAR ,長(zhǎng)度為 255。所以只要超過(guò)255字符的段都會(huì)報(bào)這個(gè)錯(cuò)。
解決方法很簡(jiǎn)單,在控制文件中字段后添加上char(1000000),例如:
LOAD DATA INFILE * INTO TABLE DEMO TRUNCATE FIELDS TERMINATED BY ',' (d1 , d2 char(1000000) )
其中表demo的列d2是clob類型,當(dāng)然1000000只是隨便用的一個(gè)大數(shù)字,只要保證加載的長(zhǎng)度不超這個(gè)數(shù)字就成
我按照這樣一改問(wèn)題就解決了。
第二步 : 在 cmd 命令窗口中寫(xiě)入導(dǎo)入語(yǔ)句
模板:
-> sqlldr userid = 用戶名 / 密碼 @ 數(shù)據(jù)庫(kù)名 control = 之前寫(xiě)的ctl控制文件的地址 bad = E:/ bad.bad log = E:/log.log
實(shí)例 :
-> sqlldr userid = everyday/123456@orcl control = E:/data.ctl bad=E:/bad.bad log = E:/ log.log
實(shí)例解釋 :
由于本人還是學(xué)生 , 還沒(méi)有上到 oracle , 只是學(xué)過(guò) mysql 。 所以oracle的一些基本概念沒(méi)有搞清(自己就隨便借了本書(shū)簡(jiǎn)單的看了一下,理清了大小關(guān)系 : 創(chuàng)建用戶 -- 數(shù)據(jù)庫(kù) -- 表空間 -- 表 ) , 之前在想 , 我創(chuàng)建用戶后只對(duì)表空間進(jìn)行的設(shè)置 , 并沒(méi)有創(chuàng)建數(shù)據(jù)庫(kù)啊 ,之后才知道當(dāng)創(chuàng)建用戶之后會(huì)自動(dòng)生成一個(gè)數(shù)據(jù)庫(kù) , 數(shù)據(jù)庫(kù)名就是 orcl 。
bad = E:/bad.bad --- 當(dāng)導(dǎo)入文件出錯(cuò)時(shí)就會(huì)在 E盤生成.bad 的文件 , 里面會(huì)記錄你出錯(cuò)誤沒(méi)有導(dǎo)入的數(shù)據(jù)
log = E:/log.log -- 當(dāng)導(dǎo)入文件 , 會(huì)記錄你導(dǎo)入文件詳細(xì)的內(nèi)容 , 包括出錯(cuò)的信息 (我之前導(dǎo)入失敗 , 原因就是從這里找的)
總結(jié)一下 : oracle sqlldr導(dǎo)入文件只需要兩步
1. 寫(xiě) CTL 控制文件
2 .在 cmd 命令窗口中寫(xiě)入導(dǎo)入語(yǔ)句
每一步上面都有講 , 如果沒(méi)有看仔細(xì)請(qǐng)往上翻重新看一遍。 這里只是我導(dǎo)入時(shí)遇到的問(wèn)題進(jìn)行了全面的講解 , 可能還會(huì)有一些不足 。 畢竟這是我第一篇文章,畢竟我還是一名學(xué)生 , 所以可能會(huì)有許多的問(wèn)題沒(méi)有考慮到 , 如果各位親看到我的文章有錯(cuò)誤也可以只出 ,我進(jìn)行修改 。 寫(xiě)這篇文章只為分享給大家并且方面我日后查閱。希望大家共同進(jìn)步
到此這篇關(guān)于詳解Oracle中sqlldr的具體用法的文章就介紹到這了,更多相關(guān)Oracle的sqlldr用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle數(shù)據(jù)庫(kù)創(chuàng)建表的方法
在數(shù)據(jù)庫(kù)中創(chuàng)建表是常見(jiàn)的操作,本文以O(shè)racle為例,介紹如何使用SQL語(yǔ)句創(chuàng)建班級(jí)表和學(xué)生表,通過(guò)本教程可以快速掌握數(shù)據(jù)庫(kù)表的創(chuàng)建過(guò)程,感興趣的朋友跟隨小編一起看看吧2024-09-09Orace查詢數(shù)據(jù)出現(xiàn)亂碼的問(wèn)題解決思路
經(jīng)常有些朋友會(huì)遇到,我明明是輸入的正確中文,為什么我在另外一臺(tái)電腦上查詢卻出現(xiàn)亂碼啦?其實(shí)這個(gè)是數(shù)據(jù)庫(kù)在進(jìn)行字符集轉(zhuǎn)換的時(shí)候出現(xiàn)了問(wèn)題,本文介紹解決方法,需要了解的朋友可以參考下2013-01-01oracle11g管理員密碼忘記怎么辦 sqlplus解決忘記密碼問(wèn)題
oracle11g管理員密碼忘記了怎么辦?這篇文章主要介紹了oracle 11g管理員密碼忘記問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06oracle在導(dǎo)入數(shù)據(jù)時(shí)報(bào)600錯(cuò)誤的解決方法
最近在工作中進(jìn)行oracle數(shù)據(jù)庫(kù)導(dǎo)入的時(shí)候遇到了600錯(cuò)誤,通過(guò)查找相關(guān)的資料,最終終于解決了,下面這篇文章主要給大家介紹了關(guān)于oracle在導(dǎo)入數(shù)據(jù)時(shí)報(bào)600錯(cuò)誤的解決方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09Oracle啟用“_optimizer_skip_scan_enabled” 參數(shù)導(dǎo)致NC系統(tǒng)卡死問(wèn)題解決方法
這篇文章主要介紹了Oracle啟用“_optimizer_skip_scan_enabled” 參數(shù)導(dǎo)致NC系統(tǒng)卡死問(wèn)題解決方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08Oracle數(shù)據(jù)庫(kù)中使用正則表達(dá)式的超詳細(xì)教程
正則表達(dá)式是一種描述簡(jiǎn)單和復(fù)雜的搜索和處理模式的方法,下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)中使用正則表達(dá)式的超詳細(xì)教程,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08Hibernate Oracle sequence的使用技巧
本文介紹了關(guān)于Hibernate中如何使用Oracle sequence的問(wèn)題以及應(yīng)注意的事項(xiàng)。2009-06-06oracle數(shù)據(jù)庫(kù)排序后如何獲取第一條數(shù)據(jù)
這篇文章主要介紹了oracle數(shù)據(jù)庫(kù)排序后如何獲取第一條數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02