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

1 ... 148 149 150 [ 151 ] 152 153 154 ... 469


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

строке (последним символом в поле COMMENTS является символ новой строки, поэтому кавычка и выдается в новой строке). Это произошло потому, что в каждой входной записи символ новой строки находится в позиции 101 и утилита SQLLDR не считает его разделителем записей. Если это не подходит, надо брать данные в кавычки и использовать конструкцию OPTIONALLY ENCLOSED BY, чтобы утилита SQLLDR загружала только данные в кавычках, без символа новой строки (не забудьте при этом добавить дополнительное место в каждой записи в атрибуте FIX). При этом завершающий символ новой строки не будет загружаться как часть данных. Итак, если изменить управляющий файл следующим образом:

LOAD DATA

INFILE demo18.dat fix 101

INTO TABLE DEFT REPLACE

FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY

TRAILING NULLCOLS

(DEPTNO,

DNAME upper(:dname) ,

LOC upper(:loc) ,

LAST UPDATED my to date(:last updated) ,

COMMENTS

и изменить файл данных так, чтобы он имел следующий вид:

C:\sqlldr>TYPE demo18.dat

10,Sales,Virginia,01-april-2001, This is the Sales

Office in Virginia

20,Accounting,Virginia,13/04/2001, This is the Accounting Office in Virginia

30,Consulting,Virginia,14/04/2001 12:02:02, This is the Consulting

Office in Virginia

40,Finance,Virginia,987268297, This is the Finance Office in Virginia

с текстом в кавычках, он будет загружен следующим образом:

tkyte@TKYTE816> select comments comments from dept;

COMMENTS

This is the Sales Office in Virginia

This is the Accounting Office in Virginia

This is the Consulting Office in Virginia

This is the Finance Office in Virginia

Предупреждаю тех, кому повезло работать и в ОС Windows NT, и в ОС UNIX. На этих платформах признаки конца строки различны. В ОС UNIX это просто \n. В ОС



484 Глава 9

Windows NT это \r\n. Предположим, мы передали файлы из предыдущего примера с помошью ftp-клиента на UNIX-машину. Если выполнить затем процедуру FILE DUMP, можно понять, с какой проблемой придется столкнуться:

ops$tkyte@ORA8I.WORLD> EXXEC file dump(MY FILES, demo17.dat);

000001-000015

000016-000030

000031-000045

000046-000060

000061-000075

000076-000090

000091-000105

000106-000120

000121-000135 000136-000150 000151-000165

000166-000180

000181-000195

000196-000210

000211-000225

000226-000240

000241-000255

000256-000270

000271-000285 000286-000300

000301-000315

000316-000330

000331-000345

000346-000360 000361-000375 000376-000390 000391-000405

10, Sales, Virgin ia,0 1-april-200

1, T h i s is the S

ales \n Office in

Virginia

\n 2 0 , Ace ounting ,Virgini

a, 13/04/2001, Th

is is the Acco u

nting\n Office in

Virginia

\n3 0,Consultin g, Virginia, 14/0

4/2001 12:02:02

,This is the Co

nsulting\n Office in Virginia

\n 4 0

Pi nance, Virgini a, 987268297, Thi

s is the Financ

e\n Office in Vir

g i n ia

PL/SQL procedure successfully completed.

Файл имеет другой размер, как и записи в нем. Каждая пара \r\n теперь представлена символом \n. В этом примере достаточно изменить значение атрибута FIX с 101 на 99, но только потому, что в каждой записи одинаковое количество строк! Длина каждой записи просто сократилась на 2 байта. Если бы в некоторых записях было три строки, их длина сократилась бы на три, а не на два байта. При этом файл изменился бы так, что записи не имели бы больше фиксированной длины. При использовании атрибута FIX убедитесь, что файл создается и загружается на однородных платформах (UNIX и UNIX, или Windows и Windows). При передаче файлов с одной из этих систем на другую они наверняка перестанут загружаться.

Использование атрибута VAR

Еще один метод загрузки данных со встроенными символами новой строки - с помощью атрибута VAR. При использовании этого формата каждая запись начинается с фиксированного количества байтов, в которых указана ее суммарная длина. С помощью



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

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

LOAD DATA

INFILE demo19.dat var 3

INTO TABLE DEPT REPLACE

FIELDS TERMINATED BY ,

TRAILING NULLCOLS

(DEPTNO,

DNAME upper(:dname) ,

LOC upper(:loc) ,

LAST UPDATED my to date(:last updated) ,

COMMENTS

то атрибут var 3 будет означать, что первые три байта каждой входной записи содержат ее длину. Если взять файл данных следующего вида:

C:\sglldr>type demol9.dat

07110,Sales,Virginia,01-april-2001,This is the Sales Office in Virginia

0762:0, Accounting,Virginia, 13/04/2001,This is the Accounting

Office in Virginia

08730,Consulting,Virginia,14/04/2001 12 :02:02,This is the Consulting Office in Virginia

07140,Finance,Virginia,987268297,This is the Finance

Office in Virginia

то их можно успешно загрузить с помощью представленного управляющего файла. В этом файле загружаемых данных четыре записи. Первая запись начинается с 071, т.е. следующим 71 байт представляет первую запись. В эти 71 байт входит и завершающий символ новой строки после слова Virginia. Следующая запись начинается с 078. В ней 78 байт, и так далее. Используя файл данных такого формата, очень легко загрузить данные со встроенными символами новой строки.

И в этом случае, если приходится работать с UNIX и NT (показан пример для NT, где новая строка представлена двумя символами), надо уточнять длину каждой записи. В ОС UNIX представленный выше файл данных придется изменить, задав 69, 76, 85 и 69 в качестве длины записей.

Использование атрибута STR

Это, наверное, самый гибкий метод загрузки данных, содержащих символы новой строки. С помощью атрибута STR можно задать новую последовательность символов, представляющую конец строки. Это позволяет создать файл данных, в котором конец каждой записи помечен какими-либо специальными символами, и символ новой строки при этом теряет свое значение.

Я предпочитаю использовать несколько символов, специальный маркер, а затем символ новой строки. Это упрощает поиск конца записи при просмотре файла данных в



1 ... 148 149 150 [ 151 ] 152 153 154 ... 469

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