欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Oracle中sqlldr的具體用法

 更新時間:2023年07月03日 10:31:02   作者:發(fā)條橙子_  
這篇文章主要介紹了詳解Oracle中sqlldr的用法,SQLLDR可以在極短的時間內(nèi)加載數(shù)量龐大的數(shù)據(jù),這是一個非常有用的工具,可用于從多種平面文件格式向Oracle數(shù)據(jù)庫中加載數(shù)據(jù),需要的朋友可以參考下

前言

由于最近做一個項目 , 需要將 .log格式的文本文件導(dǎo)入到 oracle當(dāng)中 。其中遇到過很多的問題 , 網(wǎng)上有許多的例子 ,但是對于一個沒有學(xué)過 oracle 的小白來說還是有一些晦澀。

所以我特意將我找的一些相關(guān)資料進行總結(jié)一下 。

首先導(dǎo)入 oracle 的方法有很多 , 對于不同需求有不同的導(dǎo)入方式 , 我在這里就說一下 sqlldr 的方法 。 使用sqlldr 將文本文件導(dǎo)入 oracle中確切說只需要兩步 。

第一步: 寫一個 ctl 格式的控制文件

CTL 控制文件的內(nèi)容 : (我會寫一個模板和一個樣例)

模板 :

load data -- 1. 控制文件標識

infile 'xxx.txt' -- 2. 要導(dǎo)入的數(shù)據(jù)文件名

insert into table test -- 3. 將文件插入到數(shù)據(jù)庫的 test 表中

fields terminated by X'09' -- 4. 用于分割一行中各個屬性值的符號(例如每個屬性值用逗號 分割 , 那么就把 X'09' 改為 ‘ ,’)

(id , username ,passwprd ,......) -- 5. test表中對應(yīng)的屬性名

這五個內(nèi)容是一個基本的步驟 , 注意是基本 , 基本 基本 。(重要的事情說三遍) , 導(dǎo)入文件的時候根據(jù)不同的需求會在不同的地方在添加一些內(nèi)容 , 下面舉一個我這次項目所導(dǎo)入的內(nèi)容 。

樣例:

load data

infile 'E:/user_data_one_week/zhejiang_user_data.log' -- (我的文件格式是 .log 之前上網(wǎng)查.log文件導(dǎo)入oracle的方法都沒有人遇到過 , 結(jié)果我試著用文本文件的方法沒想到可以導(dǎo)入進去)

insert into table day_data -- (我的數(shù)據(jù)庫的表名為 day_data , 其中除了 insert into table 還有其他的寫法 , 根據(jù)需求來 , 下面會詳細寫)

fields terminated by '|' --(我的數(shù)據(jù)文件每個字段也就是屬性是按照 | 來分割的)

trailing nullcols (這行就是我根據(jù)需求新加入的 , 因為我的數(shù)據(jù)中某些屬性可能是 null 值 , 如果不加入這行導(dǎo)入到數(shù)據(jù)庫的時候就會自動跳過null值的列, 這樣數(shù)據(jù)插入后就會屬性和值對應(yīng)不上)

(time, user_id, type, longitude, latitude, height, content char(10000)) (注意 : 我這里的 content 運用的類型是 clob , 但是為什么后面加了 char(10000) 下面會詳細講 , 也是一些新手會遇到的問題)

上面的樣例就是我這次項目中縮寫的 ctl 控制文件 。

CTL 控制文件大概已經(jīng)說好了 , 但是補充幾點 .

1 . 我在第三步中運用了 insert into table 還有以下幾個值

  1.  insert 為缺省方式 , 插入表中時要求表為空 , 不然會報錯 (我就是總忘記在插入前清空表 , 每次都是報錯提醒我我才過去刪除內(nèi)容的 ,吼吼)
  2. append , 在表中追加新紀錄 , 所以表不為空插入的時候也不會報錯
  3. replace , 刪除舊記錄 , 替換成新裝載的記錄 (明明我應(yīng)該用這種方法 , 但是我對 insert情有獨鐘 ,好吧,我是導(dǎo)入完才看到有這個的)
  4. reuncate 同上 (也同上沒用過 )

2 . 也就是我表中屬性 content 的問題 -- CLOB 類型插入問題

這個問題也困擾了我好久 , 在網(wǎng)上找了好久才解決的 。 下面我來分享給也受這個問題困擾的小伙伴 , 如果沒有需求 ,自動略過進入下一個環(huán)節(jié)。

由于數(shù)據(jù)長度比較大 , 所以表中 content 這個屬性類型我用了 clob , 但是導(dǎo)入數(shù)據(jù)庫時總報錯。(錯誤可以在自動生成的 log.log文件中查看,下面會講到)說我數(shù)據(jù)長度超過了定義類型的最大長度 , 這時我就納悶了 , 我已經(jīng)把類型定義為 clob了,為什么還會超過最大長度。 

當(dāng)使用sqlldr加載很長的字符串(超過4000)到表中的clob類型中時,老是報錯: 數(shù)據(jù)文件的字段超出最大長度.查找相關(guān)資料后得知,sqlldr每次讀入文件中數(shù)據(jù)流的數(shù)據(jù)類型默認為CHAR ,長度為 255。所以只要超過255字符的段都會報這個錯。

解決方法很簡單,在控制文件中字段后添加上char(1000000),例如:

LOAD DATA 
INFILE * 
INTO TABLE DEMO 
TRUNCATE 
FIELDS TERMINATED BY ',' 
(d1 ,
d2 char(1000000)
)

其中表demo的列d2是clob類型,當(dāng)然1000000只是隨便用的一個大數(shù)字,只要保證加載的長度不超這個數(shù)字就成

我按照這樣一改問題就解決了。

第二步 : 在 cmd 命令窗口中寫入導(dǎo)入語句

模板:

-> sqlldr userid = 用戶名 / 密碼 @ 數(shù)據(jù)庫名 control = 之前寫的ctl控制文件的地址 bad = E:/ bad.bad log = E:/log.log

實例 :

-> sqlldr userid = everyday/123456@orcl control = E:/data.ctl bad=E:/bad.bad log = E:/ log.log

實例解釋 :

由于本人還是學(xué)生 , 還沒有上到 oracle , 只是學(xué)過 mysql 。 所以oracle的一些基本概念沒有搞清(自己就隨便借了本書簡單的看了一下,理清了大小關(guān)系 : 創(chuàng)建用戶 -- 數(shù)據(jù)庫 -- 表空間 -- 表 ) , 之前在想 , 我創(chuàng)建用戶后只對表空間進行的設(shè)置 , 并沒有創(chuàng)建數(shù)據(jù)庫啊 ,之后才知道當(dāng)創(chuàng)建用戶之后會自動生成一個數(shù)據(jù)庫 , 數(shù)據(jù)庫名就是 orcl 。

bad = E:/bad.bad --- 當(dāng)導(dǎo)入文件出錯時就會在 E盤生成.bad 的文件 , 里面會記錄你出錯誤沒有導(dǎo)入的數(shù)據(jù)

log = E:/log.log -- 當(dāng)導(dǎo)入文件 , 會記錄你導(dǎo)入文件詳細的內(nèi)容 , 包括出錯的信息 (我之前導(dǎo)入失敗 , 原因就是從這里找的)

總結(jié)一下 : oracle sqlldr導(dǎo)入文件只需要兩步

1. 寫 CTL 控制文件

2 .在 cmd 命令窗口中寫入導(dǎo)入語句

每一步上面都有講 , 如果沒有看仔細請往上翻重新看一遍。 這里只是我導(dǎo)入時遇到的問題進行了全面的講解 , 可能還會有一些不足 。 畢竟這是我第一篇文章,畢竟我還是一名學(xué)生 , 所以可能會有許多的問題沒有考慮到 , 如果各位親看到我的文章有錯誤也可以只出 ,我進行修改 。 寫這篇文章只為分享給大家并且方面我日后查閱。希望大家共同進步

到此這篇關(guān)于詳解Oracle中sqlldr的具體用法的文章就介紹到這了,更多相關(guān)Oracle的sqlldr用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論