Думаю самое время рассмотреть наиболее интересный метод загрузки данных, а именно загрузку больших объектов! Да, как ни странно, многие и не пробовали это делать! Хотя на самом деле это довольно просто! Например, у вас есть таблица содержащая поле CLOB и вам необходимо загрузить в нее скажем вот такой текст:
Here's my favorite story on recursion: it happened that a famous Darwinist was telling a story about primitive creation myths. "Some peoples," he said, "believe the world rests on the back of a great turtle. Of course, that raises the question: on what does the turtle rest?" An elderly woman from the back of the room stood up and said, "Very clever, Sonny, but it's turtles, all the way down."
Нет ничего проще, давайте проделаем это, причем несколькими способами. Для начала создадим таблицу, с именем CLOBGET:
CREATE TABLE CLOBGET ( id NUMBER, f_name VARCHAR2(30), text CLOB ) /
Получаем: SQL> CREATE TABLE CLOBGET 2 ( 3 id NUMBER, 4 f_name VARCHAR2(30), 5 text CLOB 6 ) 7 / Таблица создана.
Затем создадим контрольный файл для загрузки с именем CLOB.ctl и вот таким содержимым:
LOAD DATA INFILE 'CLOB.DAT' INTO TABLE CLOBGET FIELDS TERMINATED BY ';' ( id, f_name, text LOBFILE ( f_name ) TERMINATED BY EOF)
Строка LOBFILE ( f_name ) TERMINATED BY EOF и определяет загрузку CLOB объекта, опираясь на поле с именем файла, который должен находиться рядом. Далее создадим файл данных для загрузки в таблицу с именем CLOB.DAT и запишем в него следующее:
001;partone.txt 002;partone.txt 003;partone.txt
И последнее создадим сам файл для выполнения загрузки в таблицу с CLOB полем getclob.bat и запишем в него:
@echo off set nls_lang=russian_cis.ru8pc866 sqlldr.exe userid=miller/kolobok control=CLOB.ctl errors=100 bad=CLOB.bad discard=CLOB.dis
Запустим файл на исполнение и убедимся, что все прошло верно заглянув в log файл:
.
.
.
Таблица CLOBGET, загружен из каждой логической записи.
Режим вставки действует для этой таблицы: INSERT
Имя столбца Позиция Дл. Огр. Вкл Тип данных
------------------------------ ---------- ----- ---- ---- ---------------------
ID FIRST * ; CHARACTER
F_NAME NEXT * ; CHARACTER
TEXT DERIVED * EOF CHARACTER
Динамический LOBFILE. Имя файла в поле F_NAME
Таблица CLOBGET:
3 Строки успешно загружено.
0 Строки не загружены из-за ошибки в данных.
0 Строки не загружены из-за сбоев во всех фразах WHEN.
0 Строки не загружены из-за того, что все поля были пусты.
Для массива привязки отведено: 33024 байт(64 строк)
Байтов буфера чтения: 1048576
Всего пропущено логических записей: 0
Всего прочитано логических записей: 3
Всего забраковано логических записей: 0
Всего удалено логических записей: 0
.
.
Процессорное время: 00:00:00.03
Не знаю как у вас, у меня все прошло успешно и в поле TEXT таблицы CLOBGET у меня появилось три рассказа про черепах и рекурсию! Я в этом убедился используя свой старый добрый PL/SQL*Developer! Вы можете использовать и другие средства. Давайте рассмотрим еще один способ, который вы можете так же использовать в дальнейшем! Сначала очистим таблицу CLOBGET от данных:
SQL> DELETE FROM CLOBGET 2 / 3 строк удалено. SQL> commit 2 / Фиксация обновлений завершена.
Далее вот так измените контролфайл используя загрузку вложенных данных, так будет удобнее:
LOAD DATA INFILE * INTO TABLE CLOBGET FIELDS TERMINATED BY ';' ( id, f_name, text LOBFILE (CONSTANT turtles.dat ) TERMINATED BY ';') BEGINDATA 001;partone 002;parttwo 003;parttri
Видите я в строке LOBFILE (CONSTANT turtles.dat ) TERMINATED BY ';' заменил EOF на ';' и вот почему, сейчас мы рассказ про черепах и рекурсию разделим на три части между тремя записями получив три части в полях TEXT, для этого создайте файл с именем turtles.dat и вот таким содержимым:
Here's my favorite story on recursion: it happened that a famous Darwinist was telling a story about primitive ; creation myths. "Some peoples," he said, "believe the world rests on the back of a great turtle. Of course, that raises the question: on what does the turtle rest?" An elderly woman from the back ; of the room stood up and said, "Very clever, Sonny, but it's turtles, all the way down.";
Видите знаки ";" после слов primitive, back и down - это определит части деления файла между строками таблицы, а параметр CONSTANT указывает на то, что мы получаем данные для CLOB из одного файла данных, все очень просто! Запустите загрузку и посмотрим содержимое log файла:
.
.
.
Таблица CLOBGET, загружен из каждой логической записи.
Режим вставки действует для этой таблицы: INSERT
Имя столбца Позиция Дл. Огр. Вкл Тип данных
------------------------------ ---------- ----- ---- ---- ---------------------
ID FIRST * ; CHARACTER
F_NAME NEXT * ; CHARACTER
TEXT DERIVED * ; CHARACTER
Статичный LOBFILE. Имя файла - turtles.dat
Таблица CLOBGET:
3 Строки успешно загружено.
0 Строки не загружены из-за ошибки в данных.
0 Строки не загружены из-за сбоев во всех фразах WHEN.
0 Строки не загружены из-за того, что все поля были пусты.
.
.
.
Процессорное время: 00:00:00.01
Все почти так же, только способ загрузки немного другой вот и все! Так можно загрузить вообще что угодно хоть видео клип, только для этого лучше использовать объект BFILE - но, о них позже. И на последок загрузим пару тройку красивых картинок в BLOB поле таблицы! Создадим табличку с именем IMGTBL:
CREATE TABLE IMGTBL ( id NUMBER(5), f_name VARCHAR2(30), img BLOB ) /
Получаем:
SQL> CREATE TABLE IMGTBL ( 2 id NUMBER(5), 3 f_name VARCHAR2(30), 4 img BLOB 5 ) 6 / Таблица создана.
Создадим контрольный файл для загрузки изображений в BLOB поле таблички IMGTBL с именем BLOBS.ctl и вот таким содержимым:
LOAD DATA INFILE * INTO TABLE imgtbl FIELDS TERMINATED BY ',' ( id, f_name, img LOBFILE ( f_name ) TERMINATED BY EOF ) BEGINDATA 001,su3712.bmp 002,cu27.bmp 003,cu27_2.bmp
Файлы su3712.bmp, cu27.bmp, cu27_2.bmp это фотографии СУ-37 и СУ-27, вы можете взять свои файлы и свои имена, только впишите их без пробелов между 001,su3712.bmp! И последнее, файл bat для загрузки с именем BLOBS.bat и содержащим такие строки:
@echo off set nls_lang=russian_cis.ru8pc866 sqlldr.exe userid=miller/kolobok control=BLOBS.ctl errors=100 bad=BLOBS.bad discard=BLOBS.dis
Что ж! Запускайте скорее файл и грузите ваши любимые картинки в базу! Смотрим log файл:
SQL*Loader: Release 9.2.0.1.0 - Production on Вск Май 30 15:43:54 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Управляющий файл: BLOBS.ctl
Файл данных: BLOBS.ctl
Файл плохих записей: BLOBS.bad
Файл удаленных записей: BLOBS.dis
(Разрешить удалять все записи)
Количество записей для загрузки: ALL
Количество записей для пропуска: 0
Допускается ошибок: 100
Массив привязки:64 строк, макс. из 256000 байт
Продолжение: ничего не задано
Использован маршрут: Условный
Таблица IMGTBL, загружен из каждой логической записи.
Режим вставки действует для этой таблицы: INSERT
Имя столбца Позиция Дл. Огр. Вкл Тип данных
------------------------------ ---------- ----- ---- ---- ---------------------
ID FIRST * , CHARACTER
F_NAME NEXT * , CHARACTER
IMG DERIVED * EOF CHARACTER
Динамический LOBFILE. Имя файла в поле F_NAME
Таблица IMGTBL:
3 Строки успешно загружено.
0 Строки не загружены из-за ошибки в данных.
0 Строки не загружены из-за сбоев во всех фразах WHEN.
0 Строки не загружены из-за того, что все поля были пусты.
Для массива привязки отведено: 33024 байт(64 строк)
Байтов буфера чтения: 1048576
Всего пропущено логических записей: 0
Всего прочитано логических записей: 3
Всего забраковано логических записей: 0
Всего удалено логических записей: 0
Прогон начался в Вск Май 30 15:43:54 2004
Прогон кончился в Вск Май 30 15:43:59 2004
Общее время: 00:00:04.72
Процессорное время: 00:00:00.25
На этот раз было потрачено 04.72 сек. для загрузки моих файлов! Общий объем всех картинок у меня составил 6 838 440 bytes! Не плохо! И PL/SQL*Developer мне все экспортировал и получились снова картинки! Что собственно и требовалось! Надеюсь вам стало понятно, что SQL*Loader на первый взгляд не приметный и простой, является очень мощным и полезным инструментом для заливки ЛЮБЫХ(!) типов данных в БД Oracle! Так, что советую с ним подружиться и использовать его на всю катушку!!! :)))