利用SQLLDR載入包含LOB物件的資料(三)
簡單描述一下透過第二資料檔案方式載入LOB型別的方法。
介紹更復雜的情況,資料檔案中檔名和目錄分別儲存。
利用SQLLDR載入包含LOB物件的資料(一):http://yangtingkun.itpub.net/post/468/521873
利用SQLLDR載入包含LOB物件的資料(二):http://yangtingkun.itpub.net/post/468/521965
事實上,如果資料檔案中檔名和目錄是分開儲存的,那麼只利用SQLLDR是沒有什麼好辦法解決這個問題的。
如果利用EXPRESSION來拼接目錄和檔名,那麼不管這個EXPRESSION是FILLER/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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用SQLLDR載入包含LOB物件的資料(二)SQL物件
- 利用SQLLDR載入包含LOB物件的資料(一)SQL物件
- 通過SQLLDR匯入LOB資料SQL
- 用sqlloader(sqlldr)裝載LOB資料SQL
- 【sqlldr載入資料】SQL
- 測試TOM=SQLLDR載入日期資料SQL
- expdp測試包含有lob型別的物件型別物件
- sqlldr 載入資料 OGG 是否會同步SQL
- 資料匯入SQLLDRSQL
- 測試TOM==SQLLDR載入固定格式資料SQL
- 測試TOM=SQLLDR使用函式載入資料SQL函式
- Oracle - LOB(大物件資料型別)Oracle物件資料型別
- 測試TOM=用PLSQL載入LOB型別資料SQL型別
- 利用CSV 引擎載入資料
- 解決dbms_lob.loadfromfile載入lob資料後出現亂碼的問題
- sqlldr 匯入資料範例SQL
- 測試TOM=SQLLDR載入內嵌換行符資料SQL
- 文字檔案的資料裝載工具sqlldrSQL
- 採用sqlldr定時將文字檔案載入進入資料庫SQL資料庫
- sqlldr載入效能問題的排查SQL
- ORACLE 的載入工具SQLLDR應用OracleSQL
- 使用oracle sqlldr匯入文字資料的例子OracleSQL
- Oracle lob載入bfile資料到blob欄位中Oracle
- SQLLDR直接載入能否分批提交?SQL
- 後設資料值物件如何載入物件
- oracle資料庫使用sqlldr命令匯入txt資料Oracle資料庫SQL
- 插入LOB物件的方法物件
- 利用IDisposable介面構建包含非託管資源物件物件
- tensorflow載入資料的三種方式
- 【實驗】【SQL*Loader】使用SQLLDR將資料載入到CLOB欄位SQL
- 使用sqlldr載入外部檔案中的資料到Oracle中(轉)SQLOracle
- sqlldr批量匯入匯出資料測試SQL
- sqlldr批次匯入匯出資料測試SQL
- sqlldr載入會產生redo嗎?SQL
- 利用ext的combobox載入資料庫資料程式碼例項資料庫
- SQLLDR直接載入幾個引數的測試SQL
- [20140109]sqlldr使用direct=true載入資料的問題.txtSQL
- 【匯入匯出】sqlldr 匯入含有內嵌換行符的資料SQL