ORACLE匯入TXT檔案資料的解決思路

來源:互聯網
上載者:User

需求情境:

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體繫結構:

650) this.width=650;" title="3.jpg" src="http://www.bkjia.com/uploads/allimg/131228/2209525938-0.jpg" />

三、實際操作示範

好了,這裡沒辦法說得太細節化,相關的知識大家自己補充。

建立一個測試表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 DATAINFILE "E:\oracle\exercises\data.txt"TRUNCATE INTO TABLE TESTFIELDS 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

650) this.width=650;" style="float:none" title="1.jpg" src="http://www.bkjia.com/uploads/allimg/131228/2209522933-1.jpg" />

3 小時前 上傳 下載附件(39.43 KB)



查詢下結果:

650) this.width=650;" style="float:none" title="2.jpg" src="http://www.bkjia.com/uploads/allimg/131228/2209525b4-2.jpg" />

3 小時前 上傳 下載附件(39.34 KB)



到此為止,提出的需求已經完成。關於控制檔案裡面的命令是什麼意思,有時間的話下次解釋一下或者留點給大家自己去學習吧。希望大家可以相互參與到討論當中,相互提高自己!




 

本文出自 “海斌的技術部落格” 部落格,轉載請與作者聯絡!

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.