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

yangtingkun發表於2011-08-07

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

介紹複雜一點的,檔名和目錄在表中分別儲存的情況。

利用SQLLDR載入包含LOB物件的資料(一):http://yangtingkun.itpub.net/post/468/521873

 

 

如果匯入資料的檔名是完整的,但是在資料庫中目錄和檔名分別儲存,這時表結構中並不需要一個完整的FULL_NAME,但是控制檔案中FULL_NAME用作LOBLOGFILE讀取列還是必須的,而且需要設定為BOUNDFILLER,而不能是FILLER

表結構如下:

SQL> DROP TABLE T_LOAD_LOB PURGE;

表已刪除。

SQL> CREATE TABLE T_LOAD_LOB
2 (ID NUMBER,
3 NAME VARCHAR2(80),
4 DIRECTORY VARCHAR2(30),
5 CREATE_DATE DATE,
6 CONTENTS BLOB);

表已建立。

控制檔案如下:

LOAD DATA
INFILE *
INTO TABLE T_LOAD_LOB
FIELDS TERMINATED BY ','
(ID CHAR(255),
FULL_NAME BOUNDFILLER CHAR(255),
DIRECTORY EXPRESSION "SUBSTR(:FULL_NAME, 1, INSTR(:FULL_NAME, '\\', -1))",
NAME EXPRESSION "SUBSTR(:FULL_NAME, INSTR(:FULL_NAME, '\\', -1) + 1)",
CREATE_DATE SYSDATE,
CONTENTS LOBFILE(FULL_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

執行匯入過程:

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

SQL*Loader: Release 10.2.0.5.0 - Production on 星期日 8 7 22:37:28 2011

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

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

檢查匯入日誌:

SQL*Loader: Release 10.2.0.5.0 - Production on 星期日 8 7 22:37:28 2011

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

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

(可廢棄所有記錄)

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

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

   列名                        位置      長度  中止 包裝資料型別
------------------------------ ---------- ----- ---- ---- ---------------------
ID                                  FIRST   255   ,       CHARACTER           
FULL_NAME                            NEXT   255   ,       CHARACTER           
  (BOUNDFILLER FIELD)
DIRECTORY                                                
表示式
   
列的 SQL : "SUBSTR(:FULL_NAME, 1, INSTR(:FULL_NAME, '\', -1))"
NAME                                                     
表示式
   
列的 SQL : "SUBSTR(:FULL_NAME, INSTR(:FULL_NAME, '\', -1) + 1)"
CREATE_DATE                                               SYSDATE
CONTENTS                          DERIVED     *  EOF      CHARACTER           
   
動態 LOBFILE  檔名在欄位 FULL_NAME

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

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

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

從 星期日 8  07 22:37:28 2011 開始執行
在 星期日 8  07 22:37:33 2011 處執行結束

經過時間為: 00: 00: 04.73
CPU
時間為: 00: 00: 00.17

檢查資料載入情況:

SQL> SELECT ID, NAME, DIRECTORY, TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')

 2  FROM T_LOAD_LOB;

        ID NAME                            DIRECTORY                    TO_CHAR(SYSDATE,'YY
---------- ------------------------------- ---------------------------- -------------------
         1 2006
年總結.doc                   d:\study\yangtk\others\     2011-08-07 22:42:01
         2 2007Oracle
開發者大會(一).doc   d:\study\yangtk\others\     2011-08-07 22:42:01
         3 2007Oracle
開發者大會(二).doc   d:\study\yangtk\others\     2011-08-07 22:42:01
         4 2007
年總結.doc                   d:\study\yangtk\others\     2011-08-07 22:42:01
.
.
.
        74
問題診斷和PLSQL方面.doc       d:\study\yangtk\others\        2011-08-07 22:42:01

已選擇74行。

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

對於檔名和目錄分別儲存的情況,可以利用EXPRESSION來從FULL_NAME中透過SQL函式來獲取需要的資訊,而FULL_NAME定義為BOUNDFILLER,這樣並不需要FULL_NAME在表中存在,還可以使用LOBFILEFULL_NAME中讀取LOB

 

 

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

相關文章