Шаг 142 - БД Oracle - SQL*Loader Загрузка LOB объектов! ЧАСТЬ VI

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


Предыдущий Шаг | Оглавление
Автор Летучий Сергей - 14.06.2004