Пример использования Oracle SQL*Loader

Статьи про Oracle -> Администрирование

Пример использования Oracle SQL*Loader

v:1.0 25.10.2010
Петрелевич Сергей

Очень часто возникает потребность загрузить в СУБД Oracle какие-нибудь данные из текстовых или бинарных файлов.
Часто программисты для решения этой задачи разрабатывают свои средства, не догадываясь, что в Oracle уже есть мощный инструмент, специально разработанный для импорта данных из файлов. Этот инструмент называется - SQL*Loader.
Цель этого очерка познакомить читателя с основными приемами работы с SQL*Loader.
За более детальной информацией обращайтесь к документации.

Итак, допустим нам надо импортировать данные из такого вот файла.

Id void1 void2 text value1 value2 file
10;0;05Apple;valid1;1;10;jpg\a1.jpg
20;0;07Orange;valid2;2;20;jpg\a2.jpg
30;0;06Lemon;valid3;3;30;jpg\a3.jpg
Файл состоит из шапки и строк с данными.
Причем, нам надо импортировать не просто так, а выполнив определенные правила:
  • импортировать все, кроме строк с Id=20;
  • импортировать поля Id, text;
  • пропустить поля void1, void2;
  • вместо полей value1 и value2 импортировать их сумму, т.е. value1+value2;
  • импортировать бинарный файл, имя которого находится в поле file.
При импорте надо учесть, что все поля могут быть переменной длины, а разделителем служит символ ";".

Данные будем импортировать в эту таблицу:

create table tLoader 
( 
  id         number primary key, 
  char_data  varchar2(30),
  val        number,
  image_data blob
);
Утилита SQL*Loader запускается следующей строкой:
sqlldr userid=scott/scott@dbstart control=control.txt log=loader.log
  • scott/scott@dbstart - типовая строка подключения к базе;
  • control.txt - этот так называемый управляющий файл;
  • loader.log - это файл логирования процесса загрузки.
В управляющем файле находятся инструкции для SQL*Loader'а, где брать данные и куда их следует положить.
Кроме того, в этом файле можно описать и требования, предъявленные к процессу импорта.
Вот текст файла:
options (skip=1)
   load data characterset CL8MSWIN1251
   infile      'example.dat'
   badfile     'example.bad' 
   discardfile 'example.dis'
   replace
   into table tLoader
        when  id<>'20'
   fields terminated by ';' optionally enclosed by '"'
   (
    id          INTEGER EXTERNAL, 
    void1       FILLER char,
    void2       FILLER char,    
    char_data   char,
    value1      BOUNDFILLER, 
    val         ":val+:value1",
    
    blob_filename BOUNDFILLER,
    image_data  LOBFILE(blob_filename) TERMINATED BY EOF
   )

Прокомментируем текст.
  • options (skip=1) - указание пропустить первую строку файла (заголовок);
  • load data characterset CL8MSWIN1251 - задание кодировки файла данных;
  • infile 'example.dat' - файл с исходными данными;
  • badfile 'example.bad' - в этот файл запишутся данные, которые не были импортированы по причине ошибок, например, строка в поле типа number;
  • discardfile 'example.dis' - в этот файл попадут строки, которые не соответствуют условию загрузки, в нашем случае здесь будет строка с id=20;
  • Replace - говорит о том, что если в таблице уже есть данные, их надо заменить;
  • into table tLoader when id<>'20' - указание имени таблицы и условия фильтрации данных;
  • fields terminated by ';' optionally encosed by '"' - поля разделяются символом ";", и могут содержать кавычки;
Далее идет описание формата данных:
  • поле Id - целое число;
  • поля void1 и void2 пропускаем;
  • поле char_data помещаем в таблицу;
  • Поле value1 пропускаем, но значение запоминаем;
  • Значение val получаем как сумму значения текущего поля и предыдущего, которое запомнили;
  • Имя файла blob_filename зачитываем и сохраняем и выполняем загрузку image_data LOBFILE(blob_filename) TERMINATED BY EOF бинарного фалйа.
Дополнительно отмечу, что совпадение названий полей в шапке файла и полей в управляющем файле сделано для удобства, эти наименования могут не совпадать.

Как видите, SQL*Loader - это мощное средство СУБД Oracle, которое позволяет решить большинство типовых задач импорта данных.

Метки: Импорт/Экспорт данных  

Комментарии.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.