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

1 ... 141 142 143 [ 144 ] 145 146 147 ... 469


462 Глава 9 LOC

BEGINDATA

20,Something Not To Be Loaded,Accounting, Virginia,USA В результате получится следующая таблица DEPT: tkyte@TKYTE816> select * from dept;

DEPTNO DNAME LOC

20 Accounting Virginia,USA

Загрузка данных в фиксированном формате

Часто имеется текстовый файл, который сгенерирован внешней системой и содержит записи фиксированной длины с данными в фиксированных символьных позициях. Например, поле NAME задано в позициях с 1 по 10, поле ADDRESS - позициях с 11 по 35 и т.д. Давайте рассмотрим, как с помощью утилиты SQLLDR импортировать такие данные.

Эти данные в виде записей фиксированной длины с полями в заранее известных позициях являются оптимальными для загрузки с помощью SQLLDR. Они обрабатываются быстрее всего, поскольку поток данных очень просто анализировать. Утилита SQLLDR будет читать данные с фиксированных позиций фиксированной длины и помещать их в поля, что сделать очень просто. Если необходимо загрузить очень большой объем данных, лучше всего преобразовать их в формат с фиксированными полями. Недостатком файла в фиксированном формате является, конечно же, то, что он может быть намного больше по размеру, чем соответствующий файл в формате с разделителями.

Для загрузки данных с фиксированных позиций, необходимо использовать в управляющем файле ключевое слово POSITION. Например:

LOAD DATA INFILE * INTO TABLE DEFT REPLACE

(DEPTNO position(1:2), DNAME position(3:16),

LOC position(17:29)

BEGINDATA

l0Accounting Virginia,USA

В этом управляющем файле не используется конструкция FIELDS TERMINATED BY, вместо этого для указания начала и конца полей используется конструкция POSITION. Следует отметить, что с помощью конструкции POSITION можно задавать перекрывающиеся поля, в любом порядке. Например, если бы пришлось изменить таблицу DEPT следующим образом:

1kyte@TKYTE81 alter table dept add entire line varchar(29);

Table altered.



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

то затем для загрузки можно было бы использовать управляющий файл:

LOAD DATA INFILE * INTO TABLE DEPT REPLACE

(DEPTNO position(1:2),

DNAME position (3:16) ,

LOC position(17:29),

ENTIRE LINE position(1:29)

BEGINDATA

l0Accounting Virginia,USA

Позиции поля ENTIRE LINE определяются как (1:29) - в него попадают все 29 байт данных, тогда как другие поля - всего лишь подстроки загружаем1х данных. Результат применения представленного выше управляющего файла будет таким:

tkyte@TKYTE816> select * from dept;

DEPTNO DNAME LOC ENTIRE LINE

10 Accounting Virginia,USA l0Accounting Virginia,USA

При использовании конструкции POSITION, можно задавать как абсолютные, так и относительные смещения. В представленном выше примере использовались абсолютные смещения. Я явно указывал, где начинаются поля и где они заканчиваются. Этот управляющий файл можно переписать следующим образом:

LOAD DATA INFILE * INTO TABLE DEPT REPLACE

(DEPTNO position(1:2) ,

DNAME position(*:16),

LOC position(*:29),

ENTIRE LINE position(1:29)

BEGINDATA

l0Accounting Virginia,USA

Символ * требует начать поле с той позиции, перед которой закончилось предыдущее. Поэтому в нашем случае (*:1б) - это то же самое, что и (3:16). Учтите, что можно задавать как абсолютные, так и относительные позиции в одном управляющем файле. Кроме того, при использовании символа * можно добавлять к смещению константы. Например, если поле DNAME начинается через два символа после завершения поля DEPTNO, можно использовать конструкцию (*+2:1б). В нашем примере это будет идентично использованию конструкции (5:16).

Завершающая позиция поля в конструкции POSITION должна задаваться как абсолютная, с начала записи. Иногда может быть проще указать начальную позицию и длину поля, особенно если поля идут подряд, как в предыдущем примере. При этом доста-



Глава 9

точно указать утилите SQLLDR, что запись начинается с символа 1, а затем задать длину каждого поля. Это позволит не вычислять смешения начала и конца каждого поля от начала записи, что иногда затруднительно. Для этого завершающая позиция поля не указывается, а вместо нее задается длина каждого поля в записи фиксированного формата, как показано ниже:

LOAD DATA INFILE * INTO TABLE DEPT REPLACE

( DEPTNO position(1) char(2),

DNAME position(*) char(14),

LOC position(*) char(13) ,

ENTIRE LINE position(1) char(29)

BEGINDATA

l0Accounting Virginia,USA

Здесь пришлось указать утилите SQLLDR, где начинается первое поле и его длину. Каждое последующее поле начинается со следующей позиции после завершения предыдущего и имеет указанную длину. Абсолютные позиции надо указать только для последнего поля, поскольку оно начинается с начала записи.

Загрузка дат

Загрузка дат с помощью SQLLDR выполняется достаточно просто, но у многих вызывает вопросы. Нужно просто указать тип данных DATE в управляющем файле и соответствующую маску формата даты. Маска формата даты такая же, как и для функций TO CHAR и TO DATE в SQL Утилита SQLLDR применит эту маску к данным и загрузит их автоматически.

Например, если еще раз изменить нашу таблицу DEPT:

1kyte@TKYTE81 alter table dept add last updated date; Table altered,

то можно будет загрузить в нее данные с помощью следующего управляющего файла:

LOAD DATA INFILE * INTO TABLE DEPT REPLACE

FIELDS TERMINATED BY , (DEPTNO, DNAME, LOC,

LAST UPDATED date dd/mm/yyyy

BEGINDATA

10,Sales,Virginia,1/5/2 000

2 0,Accounting,Virginia,21/6/1999



1 ... 141 142 143 [ 144 ] 145 146 147 ... 469

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