Думаю самое время рассмотреть наиболее интересный метод загрузки данных, а именно загрузку больших объектов! Да, как ни странно, многие и не пробовали это делать! Хотя на самом деле это довольно просто! Например, у вас есть таблица содержащая поле 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! Так, что советую с ним подружиться и использовать его на всю катушку!!! :)))