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

yangtingkun發表於2011-08-14

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

介紹更復雜的情況,資料檔案中檔名和目錄分別儲存。

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

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

 

 

事實上,如果資料檔案中檔名和目錄是分開儲存的,那麼只利用SQLLDR是沒有什麼好辦法解決這個問題的。

如果利用EXPRESSION來拼接目錄和檔名,那麼不管這個EXPRESSIONFILLER/BOUNDFILLER熟悉還是表中真實存在的列,都無法在LOAD LOB的時候提供正確的資訊,因為EXPRESSION是透過SQL表示式生成,而LOAD LOB時,這個資訊還沒有生成。

如果真的這樣做的話,會導致SEGMENTATION FAULT的錯誤,這篇文章已經詳細了這個問題:http://yangtingkun.itpub.net/post/468/521911

那麼是不是利用SQLLDR就沒有辦法了,其實也不是,不過不能只利用SQLLDR,而是採用以SQLLDR作為驅動的外部表的方法。

事實上外部表之所以可以直接這個功能,是因為外部表中不是簡單的透過路徑來讀取LOB,而是透過DIRECTORY來實現。

這裡給出一個簡單的例子,當匯入的目錄比較固定時,可以透過下面的外部表方式匯入:

SQL> CREATE TABLE T_EXTER_LOB
  2  (ID NUMBER,
  3  NAME VARCHAR2(80),
  4  DIRECTORY VARCHAR2(25),
  5  CONTENTS BLOB
  6  )
  7  ORGANIZATION EXTERNAL
  8  (TYPE ORACLE_LOADER
  9  DEFAULT DIRECTORY D_TEMP
 10  ACCESS PARAMETERS
 11  (RECORDS DELIMITED BY NEWLINE
 12  FIELDS TERMINATED BY ','
 13  (ID CHAR,
 14  DIRECTORY CHAR,
 15  NAME CHAR )
 16  COLUMN TRANSFORMS
 17  (CONTENTS FROM LOBFILE(CONSTANT 'D_DIR':NAME) FROM (D_DIR)))
 18  LOCATION ('TEMP.DAT'));

表已建立。

SQL> CREATE OR REPLACE DIRECTORY D_TEMP AS 'D:\TEMP';

目錄已建立。

SQL> CREATE OR REPLACE DIRECTORY D_DIR AS 'D:\STUDY\YANGTK\OTHERS';

目錄已建立。

對應的資料檔案TEMP.DAT中資料為:

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

下面利用CREATE TABLE AS SELECT的方式來載入資料:

SQL> CREATE TABLE T_LOAD_LOB
  2  AS SELECT * FROM T_EXTER_LOB;

表已建立。

SQL> SELECT ID, DIRECTORY, NAME FROM T_LOAD_LOB;

ID DIRECTORY NAME
---------- ------------------------- ------------------------------
         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

已選擇74行。

檢查載入日誌,確認外部表載入成功:

日誌檔案開啟於 08/14/11 23:13:26

T_EXTER_LOB 的欄位定義
記錄格式 DELIMITED BY NEWLINE
檔案中的資料與該平臺的 endianness 格式相同
接受帶有空欄位的行

資料來源中的欄位:

ID CHAR (255)
"," 終止
SQL 載入程式一樣修剪空白
DIRECTORY CHAR (255)
"," 終止
SQL 載入程式一樣修剪空白
NAME CHAR (255)
"," 終止
SQL 載入程式一樣修剪空白

列轉換
CONTENTS
LOBFILE 中設定
目錄來自常數 D_DIR
忽略目錄物件列表
檔案來自欄位 NAME
檔案包含字元資料
在字符集 ZHS16GBK

最後透過全文索引驗證BLOB欄位載入成功:

SQL> CREATE INDEX IND_T_LOB_CONTENTS
  2  ON T_LOAD_LOB(CONTENTS) 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-704831/,如需轉載,請註明出處,否則將追究法律責任。

相關文章