В этой статье будет показано как использовать SQL*Loader для загрузки CLOB и BLOB данных, активировать параллельные операции загрузки при загрузке больших объемов данных. Существует несколько методов загрузки LOB средствами SQL*Loader, но в статье мы остановимся на методе LOBFILE, используя один LOB в одном файле.
Создадим 4 файла со следующим содержимым и поместим их в директорию, например в /tmp:
clob_test1.txt
This is demo CLOB file clob_test1.txt
clob_test2.txt
This is demo CLOB file clob_test2.txt
blob_test1.doc
This is demo BLOB file blob_test1.doc
blob_test2.doc
This is demo BLOB file blob_test2.doc
Первые два файла - обычные текстовые файлы, два других - документы Microsoft Word. Документы содержащие CLOB и BLOB данные будут загружены с использованием SQL*Loader.
Создается текстовый файл lob_test_data.txt содержащий регулярные данные и ссылку на файлы с CLOB и BLOB содержимым:
1,one,10-OKT-2008,clob_test1.txt,blob_test1.doc
2,two,11-OKT-2008,clob_test2.txt,blob_test2.doc
Теперь есть все необходимые данные для загрузки. Создаем таблицу, в которую будем загружать данные:
DROP TABLE lob_tab;
CREATE TABLE lob_tab (
number_content NUMBER(10),
varchar2_content VARCHAR2(100),
date_content DATE,
clob_content CLOB,
blob_content BLOB
);
После создания таблицы, определяем управляющий файл SQL*Loader - lob_test.ctl, со следующим содержимым:
LOAD DATA
INFILE 'lob_test_data.txt'
INTO TABLE lob_tab
FIELDS TERMINATED BY ','
(number_content CHAR(10),
varchar2_content CHAR(100),
date_content DATE "DD-MON-YYYY" ":date_content",
clob_filename FILLER CHAR(100),
clob_content LOBFILE(clob_filename) TERMINATED BY EOF,
blob_filename FILLER CHAR(100),
blob_content LOBFILE(blob_filename) TERMINATED BY EOF)
Следует отметить, что колонки содержащие имя файла отмечены как FILLER, они не загружаются, но используются при определении LOBFILE, для определения места содержания LOB информации.
Затем данные загружаются, для этого из командной строки выполняется команда, из той же директории где лежат файлы:
sqlldr userid=test/test@db10g control=lob_test.ctl log=lob_test.log bad=lob_test.bad
Выполним следующий запрос, и он покажет, что данные были успешно загружены:
COLUMN varchar2_content FORMAT A16
COLUMN date_content FORMAT A12
COLUMN clob_content FORMAT A20
SELECT number_content,
varchar2_content,
TO_CHAR(date_content, 'DD-MON-YYYY') AS date_content,
clob_content,
DBMS_LOB.getlength(blob_content) AS blob_length
FROM lob_tab;
NUMBER_CONTENT VARCHAR2_CONTENT DATE_CONTENT CLOB_CONTENT BLOB_LENGTH
-------------- ---------------- ------------ -------------------- -----------
1 one 10-OKT-2008 This is a CLOB test1 24064
2 two 11-OKT-2008 This is a CLOB test2 24064
2 rows selected.
SQL>