![]() |
|
Программирование >> Oracle
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
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |