Программирование >>  Oracle 

1 ... 155 156 157 [ 158 ] 159 160 161 ... 469


504 Глава 9

Утилита SQLLDR также поддерживает загрузку файла структурированных данн1х, ссылающегося на единственный внешний файл данных. Можно указать утилите SQLLDR, как выбирать данные больших объектов из этого файла, так что для каждой строки структурированных данных будет загружаться соответствующий его фрагмент. Поскольку такой режим используется очень редко (лично мне он пока ни разу не понадобился), описывать его я не буду. Такие внешние файлы в SQLLDR называются сложными вторичными файлами данных.

Файлы LOBFILE - относительно простые файлы данных, предназначенные для загрузки больших объектов. Файлы LOBFILE от основных файлов данных отличает отсутствие понятия запись, поэтому в них вполне можно использовать символы новой строки. В файлах LOBFILE данные могут быть представлены в одном из следующих форматов:

в виде полей фиксированной длины (например, загрузить байты с 100-го по

1000-ый из файла LOBFILE);

в виде полей с разделителями (поля завершаются чем-то или взяты в кавычки );

в виде пар длина-значение, т.е. полей переменной длины.

Чаше всего используется формат с разделителями, причем разделителем является символ EOF (конец файла). Обычно имеется каталог с файлами, которые необходимо загрузить в столбцы больших объектов - каждый файл целиком попадает в столбец типа BLOB. Для этого используется оператор LOBFILE с конструкцией TERMINATED BY EOF.

Итак, допустим, имеется каталог с файлами, которые надо загрузить в базу данн1х. Необходимо загрузить информацию о владельце файла (OWNER), дату создания файла (TIMESTAMP), имя файла (NAME) и его данные. Загружать мы будем в следующую таблицу:

tkyte@TKYTE816> create table lob demo

2 (owner varchar2(255) ,

3 timestamp date,

4 filename varchar2(255),

5 text clob

Table created.

С помощью простой команды ls -l в Unix или dir /q /n в Windows можно сгенерировать файл данных и загрузить его с помощью такого, например, управляющего файла для ОС Unix:

LOAD DATA

INFILE *

REPLACE

INTO TABLE LOB DEMO

(owner position(16:24),

timestamp position(34:45) date Mon DD HH24:MI ,



Загрузка данных

filename position(47:100),

text LOBFILE (filename) TERMINATED BY EOF

BEGINDATA

-rw-r-r-

tkyte

1785

12:56

demo10.log

-rw-r-r-

tkyte

1674

15:57

demo2.log

-rw-r-r-

tkyte

1637

14:43

demo3.log

-rw-r-r-

tkyte

2385

15:05

demo4.log

-rw-r-r-

tkyte

2048

15:32

demo5.log

-rw-r-r-

tkyte

1801

15:56

demo6.log

-rw-r-r-

tkyte

1753

16:03

demo7.log

-rw-r-r-

tkyte

1759

16:41

demo8.log

-rw-r-r-

tkyte

1694

16:27

demo8a.log

-rw-r-r-

tkyte

1640

16:17

demo9.log

В случае Windows, аналогичный управляющий файл будет иметь вид: LOAD DATA

INFILE *

REPLACE

INTO TABLE LOB DEMO

(owner position(40:61),

timestamp position(1:18)

to date(:timestampm,mm/dd/yyyy filename position(63:80),

text LOBFILE (filename) TERMINATED BY EOF

hhrmiam) .

BEGINDATA

04/14/2001

12:36p

1,697

BUILTIN\Administrators

demol0.log

04/14/2001

12:42p

1,785

BUILTIN\Administrators

demoll.log

04/14/2001

12:47p

2,470

BUILTIN\Administrators

demol2.log

04/14/2001

12:56p

2,062

BUILTIN\Administrators

demol3.log

04/14/2001

12:58p

2,022

BUILTIN\Administrators

demol4.log

04/14/2001

01:38p

2,091

BUILTIN\Administrators

demol5.log

04/14/2001

04:29p

2,024

BUiLTIN\Administrators

demol6.log

04/14/2001

05:31p

2,005

BUILTIN\Administrators

demol7.log

04/14/2001

05:40p

2,005

BUILTIN\Administrators

demol8.log

04/14/2001

07:19p

2,003

BUILTIN\Administrators

demol9.log

04/14/2001

07:29p

2,011

BUILTIN\Administrators

demo20.log

04/15/2001

11:26a

2,047

BUILTIN\Administrators

demo21.log

04/14/2001

11:17a

1,612

BUILTIN\Administrators

demo4.log

Обратите внимание, что мы не загружали данные типа DATE в столбец timestamp - пришлось использовать SQL-функцию для преобразования формата даты Windows в формат, приемлемый для СУБД. Теперь, если проверить содержимое таблицы LOB DEMO после запуска утилиты SQLLDR, получим:

timestamp, filename, dbms lob.getlength(text)

tkyte@TKYTE816> select owner, 2 from lob demo;

OWNER

TIMESTAMP FILENAME

DBMS LOB.GETLENGTH (TEXT)

BUILTIN\Administrators BUILTIN\Administrators

14-APR-01 demol0.log 14-APR-01 demoll.log

1697 1785



Глава 9

BUILTIN\Administrators

14-APR-01

demol2.log

2470

BOILTIN\Administrators

14-APR-01

demo4.log

1612

BUILTIN\Administrators

14-APR-01

demol3.log

2062

BUILTIN\Administrators

14-APR-01

demol4.log

2022

BUILTIN\Administrators

14-APR-01

demol5.log

2091

BUILTIN\Administrators

14-APR-01

demol6.log

2024

BUILTIN\Administrators

14-APR-01

demol7.log

2005

BUILTIN\Administrators

14-APR-01

demol8.log

2005

BUILTIN\Administrators

14-APR-01

demol9.log

2003

BUILTIN\Administrators

14-APR-01

demo20.log

2011

BUILTIN\Administrators

15-APR-01

demo21.log

2047

13 rows selected.

Этот подход можно применять и для больших двоичных объектов. Загрузить таким

способом каталог с изображениями - очень просто.

Загрузка данных больших объектов в объектные столбцы

Теперь, зная, как загружать данные в простую таблицу, специально для этого созданную, можно переходить к загрузке в уже существующую таблицу, включающую столбец сложного объектного типа с атрибутом типа большого объекта. Чаще всего это приходится делать при использовании средств обработки изображений interMedia или картриджа Virage Image Cartridge (VIR) в СУБД. Они используют сложный объектный тип ORDSYS.ORDIMAGE для столбцов таблиц. Необходимо научиться загружать в них данные с помощью утилиты SQLLDR. Для загрузки большого объекта в столбец типа ORDIMAGE надо немного разобраться в структуре типа ORDIMAGE. С помощью таблицы, в которую мы будем выполнять загрузку, и простой команды DESCRIBE, примененной к этой таблице и используемым типам в SQL*Plus, можно понять, что, имея столбец IMAGE типа ORDSYS.ORDIMAGE, данные надо загружать в IMAGE.SOURCE.LOCALDATA. Следующий пример можно выполнить, только если установлена и сконфигурирована опция interMedia или картридж Virage Image Cartridge, иначе тип данных ORDSYS.ORDIMAGE системе не будет известен:

ops$tkyte@ORA8I.WORLD> create table image load(

id number, name varchar2(255) , image ordsys.ordimage

Table created. ops$tkyte@ORA8I.WORLD> Name

desc image load

Null?

Type

NAME

IMAGE

ops$tkyte@ORA8I.WORLD>

desc ordsys.ordimage

NUMBER

VARCHAR2(255) ORDSYS.ORDIMAGE



1 ... 155 156 157 [ 158 ] 159 160 161 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика