利用SQLLDR載入包含LOB物件的資料(一)

yangtingkun發表於2011-08-05

簡單描述一下透過第二資料檔案方式載入LOB型別的方法。

這裡給出一個最簡單的載入例子。

 

 

利用SQLLOADER來載入LOB資料,根據LOB資料的儲存方式的不同方法也不相同,如果LOB資料和其他列資料儲存在一起,那麼載入LOB其實和其他列沒有太大的區別,但是這種情況一般來說也比較少見。而一般常見的情況是,每個LOB都單獨儲存在一個檔案中,而主資料檔案中包含每條記錄對應的LOB檔案的路徑和名稱。因此這裡主要討論這種情況。

這篇文章討論最簡單的方式,資料檔案中記錄的是完整的路徑和檔名,而表中有一個單獨的欄位儲存這部分內容。

表結構如下:

SQL> CREATE TABLE T_LOAD_LOB
2 (ID NUMBER PRIMARY KEY,
3 NAME VARCHAR2(100),
4 CREATE_DATE DATE,
5 CONTENTS BLOB);

表已建立。

獨立的LOB檔案來自我的一些文件,控制檔案如下:

LOAD DATA
INFILE *
INTO TABLE T_LOAD_LOB
FIELDS TERMINATED BY ','
(ID CHAR(255),
NAME CHAR(255),
CREATE_DATE SYSDATE,
CONTENTS LOBFILE(NAME) TERMINATED BY EOF)
BEGINDATA
1,d:\study\yangtk\others\2006
年總結.doc
2,d:\study\yangtk\others\2007Oracle
開發者大會(一).doc
3,d:\study\yangtk\others\2007Oracle
開發者大會(二).doc
4,d:\study\yangtk\others\2007
年總結.doc
.
.
.
74,d:\study\yangtk\others\
問題診斷和PLSQL方面.doc

利用sqlldr執行匯入:

D:\TEMP>SQLLDR TEST/TEST CONTROL=SQLLDR_LOB.CTL

SQL*Loader: Release 10.2.0.5.0 - Production on 星期五 8 5 17:54:37 2011

Copyright (c) 1982, 2007, Oracle. All rights reserved.

達到提交點 - 邏輯記錄計數 64
達到提交點 - 邏輯記錄計數 73
達到提交點 - 邏輯記錄計數 74

對應的LOG資訊為:

SQL*Loader: Release 10.2.0.5.0 - Production on 星期五 8 5 17:54:37 2011

Copyright (c) 1982, 2007, Oracle. All rights reserved.

控制檔案: SQLLDR_LOB.CTL
資料檔案: SQLLDR_LOB.CTL
錯誤檔案: SQLLDR_LOB.bad
廢棄檔案: 未作指定

(
可廢棄所有記錄)

要載入的數: ALL
要跳過的數: 0
允許的錯誤: 50
繫結陣列: 64 , 最大 256000 位元組
繼續: 未作指定
所用路徑: 常規

T_LOAD_LOB,已載入從每個邏輯記錄
插入選項對此表 INSERT 生效

列名 位置 長度 中止 包裝資料型別
------------------------------ ---------- ----- ---- ---- ---------------------
ID FIRST 255 , CHARACTER
NAME NEXT 255 , CHARACTER
CREATE_DATE SYSDATE
CONTENTS DERIVED * EOF CHARACTER
動態 LOBFILE。 檔名在欄位 NAME


T_LOAD_LOB:
74
行 載入成功。
由於資料錯誤, 0 行 沒有載入。
由於所有 WHEN 子句失敗, 0 行 沒有載入。
由於所有欄位都為空的, 0 行 沒有載入。


為繫結陣列分配的空間: 33024 位元組 (64 )
讀取 緩衝區位元組數: 1048576

跳過的邏輯記錄總數: 0
讀取的邏輯記錄總數: 74
拒絕的邏輯記錄總數: 0
廢棄的邏輯記錄總數: 0

從 星期五 8 05 17:54:37 2011 開始執行
在 星期五 8 05 17:54:45 2011 處執行結束

經過時間為: 00: 00: 07.40
CPU
時間為: 00: 00: 00.28

檢查資料庫中匯入資訊:

SQL> SELECT ID, NAME, TO_CHAR(CREATE_DATE, 'YYYY-MM-DD HH24:MI:SS')
  2  FROM T_LOAD_LOB;

        ID NAME                                                         TO_CHAR(CREATE_DATE
---------- ------------------------------------------------------------ -------------------
         1 d:\study\yangtk\others\2006
年總結.doc                        2011-08-05 17:54:40
         2 d:\study\yangtk\others\2007Oracle
開發者大會(一).doc        2011-08-05 17:54:40
         3 d:\study\yangtk\others\2007Oracle
開發者大會(二).doc        2011-08-05 17:54:40
         4 d:\study\yangtk\others\2007
年總結.doc                        2011-08-05 17:54:40
.
.
.
        74 d:\study\yangtk\others\
問題診斷和PLSQL方面.doc               2011-08-05 17:54:45

已選擇74行。

至於BLOB欄位的內容是否匯入成功,可以藉助全文索引來進行檢查:

SQL> CREATE INDEX IND_T_LOB_CONTENTS
2 ON T_LOAD_LOB (CONTENTS)
3 INDEXTYPE IS CTXSYS.CONTEXT;

索引已建立。

SQL> SELECT COUNT(*)
2 FROM T_LOAD_LOB
3 WHERE CONTAINS(CONTENTS, 'ORACLE') > 0;

COUNT(*)
----------
        52

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-704308/,如需轉載,請註明出處,否則將追究法律責任。

相關文章