需求場景:
data.txt源數據:
[INFO] 2012-12-01 00:01:17 1610 FHR "行號=24. 查看指定計劃的鋼卷數據. 計劃號=121200102." [INFO] 2012-12-01 00:03:13 1610 FHR "行號=24. 查看指定計劃的鋼卷數據. 計劃號=121200103." [INFO] 2012-12-01 00:20:21 7362 RICC "IntervalTime=0,RollingTime=0" [INFO] 2012-12-01 00:20:21 7363 RICC "WRTFMOff: 24.5, 24.8, 24.9, 25.1, 25.3, 25.3, 25.4, 26.5[C]." [INFO] 2012-12-01 00:20:21 7362 RICC "IntervalTime=0, RollingTime=0, WRTFMOff:fT=24.632685"
拿到這一份源數據後,第一眼我們看到像這種類型的數據就是應該使用sql*loader工具。把該源文件的數據導入到oracle數據庫。
那麼,我們先來熟悉一下這個工具:
一、sql*loader的概述
很多情況之下,我們的數據需要批量處理傳輸到庫,或者在庫之間批量傳輸數據。其中,常見
的情形是用從事務處理系統提取的數據填充數據倉庫,或將數據從實時系統複製到測試開發環境。對
大規模操作而言,使用標準的INSERT語句插入數據並不總是最佳方式,而oracle本身附帶了SQL*Loader和Data Pump功能來支持批量操作。通過使用外部表,還可以在不將數據插入數據庫的情況下讀取數據。
從體系結構上講,SQL*Loader進程與其他用戶進程類似:它通過服務器進程連接到數據庫。
要插入行,可以採用兩種技術:常規方式或直接路徑讀取。常規方式是使用INSERT。SQL*Loader用戶進程構造values子句中包含綁定變量的insert語句,然後讀取源數據文件,爲每一個要插入的行執行
一次insert。此方法使用數據庫緩衝區緩存,並生成撤銷(undo)和重做數據(redo log),這些insert
語句與其他同類語句相似,通過普通的提交處理實現數據永久化。
直接路徑是避開了database buffer,sql*loader讀取源數據文件,並將內容發送到服務器進程。
此後,服務器進程在其PGA中組裝表數據中的塊,並將它們直接寫入數據文件。寫操作在表的高水位
線上完成,稱爲數據保存(data save)。高水位線是表段中的一個標記,其上未寫入任何數據:高水
位線上的空間是分配給尚未使用的表的空間。加載完成後,sql*loader移動高水位線,從而包含最新
寫入的數據塊,並且其他用戶都可以立即看見這些數據塊內的行。上述操作相當於一個commit命令。
此時不會生成撤銷,也可以主動的取消重做日誌的生成。所以說,直接路徑加載是很快捷的。
二、SQL*Loader直接路徑缺點
直接路徑也存在以下缺點:
1、執行操作期間,必須刪除或禁用引用完整性約束(只能實施unique、primary key、not null約束)。
2、會將針對其他會話的DML鎖定表
3、不會激活insert觸發器
4、無法爲羣集表使用
sql*loader體系結構:
三、實際操作演示
好了,這裏沒辦法說得太細節化,相關的知識大家自己補充。
新建一個測試表TEST(我們要把源數據導入這個表):
SQL>conn hr/oracle@testdb
SQL> create table test(
2 name varchar2(10),
3 indate varchar2(20),
4 intime varchar2(20),
5 num int,
6 source varchar2(10),
7 description varchar2(128)
8 );
準備好data.txt、data_test.ctl(加載所要使用的控制文件,定義數據規則的)
data_test.ctl:
LOAD DATA INFILE "E:\oracle\exercises\data.txt" TRUNCATE INTO TABLE TEST FIELDS TERMINATED BY " " optionally enclosed by '"' (NAME,INDATE,INTIME,NUM,SOURCE,DESCRIPTION)
sqlldr這個命令就是sql*loader工具,是在$ORACLE_HOME/bin目錄下
C:\Documents and Settings\Administrator>sqlldr hr/oracle@testdb control=E:\oracle\exercises\data_test.ctl log=E:\oracle\exercises\data_test.log
查詢下結果:
到此爲止,提出的需求已經完成。關於控制文件裏面的命令是什麼意思,有時間的話下次解釋一下或者留點給大家自己去學習吧。希望大家可以相互參與到討論當中,相互提高自己!