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

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


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

Наиболее популярным форматом данных с разделителями является формат CSV (comma-separated values - значения через запятую). При этом формате файла, когда каждое поле данных отделяется от следующего запятой, текстовые строки можно брать в кавычки, так что в самой строке данных может содержаться запятая. Если в строке также должен быть символ кавычки, принято соглашение удваивать такой символ кавычки (в представленном ниже коде мы использовали , а не просто ).

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

LOAD DATA

INFILE *

INTO TABLE DEPT

REPLACE

FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY (DEPTNO, DNAME,

BEGINDATA

10,Sales,USA

20,Accounting, Virginia,USA

30,Consulting,Virginia

40,Finance,Virginia

50, Finance , ,Virginia

60, Finance Virginia

Основное содержится в следующей строке:

FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY

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

tkyte@TKYTE816> select * from dept;

DEPTNO DNAME LOC

10 Sales USA

20 Accounting Virginia,USA

30 Consulting Virginia

40 Finance Virginia

50 Finance

60 Finance

6 rows selected.

Обратите внимание на следующее:

USA - это результат, полученный из загружаем1х данных видаUSA. Утилита SQLLDR восприняла два вхождения как одну кавычку внутри строки в кавычках. Для загрузки данных с необязательными символами, используемыми вокруг строк, необходимо эти символы удваивать.




Глава 9

Virginia,USA в качестве местонахождения отдела 20 - это результат, полученный при загрузке данных вида Virginia,USA . Это поле загружаемых данных пришлось взять в кавычки, чтобы можно было загрузить запятую как часть данных. Иначе запятая считалась бы признаком конца поля, и слово Virginia было бы загружено без уточнения USA.

Записи для отделов 50 и 60 б1ли загружены с пустыми (Null) значениями в поле местонахождения. Если данных нет, можно указывать пустую строку в кавычках, а можно и не указывать - результат будет тем же.

Еще один популярный формат - данные, разделяемые символами табуляции. Есть два способа загрузки таких данных с помощью конструкции TERMINATED BY:

TERMINATED BY X09, т.е. символ табуляции задается в шестнадцатиричном виде (9 - это ASCII-код символа табуляции), но можно также использовать конструкцию

TERMINATED BY WHITESPACE

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

LOAD DATA

INFILE *

INTO TABLE DEPT

REPLACE

FIELDS TERMINATED BY WHITESPACE

(DEPTNO, DNAME,

LOC)

BEGINDATA

10 Sales Virginia

На странице это может быть неочевидным, но между каждым приведенным выше фрагментом данных указаны два символа табуляции. Строка данных фактически имеет вид:

10\t\tSales\t\tVirginia

где \t - стандартная управляющая последовательность для представления символа табуляции. При использовании управляющего файла с конструкцией TERMINATED BY WHITESPACE, как показано выше, в таблице DEPT окажутся следующие данные:

tkyte@TKYTE816> select * from dept;

DEPTNO DNAME LOC

10 Sales Virginia

Если указана конструкция TERMINATED BY WHITESPACE, в строке ищется первое вхождение пробельного символа (табуляции, пробела или перевода строки), после чего разделителем считается все вплоть до следующего непробельного символа. Поэто-



Загрузка данн1х 461

му при разборе данных DEPTNO получает значение 10, а два следующих символа табуляции считаются разделителем, затем значение Sales присваивается столбцу DNAME и так далее.

Если указать конструкцию FIELDS TERMINATED BY X09 как в следующем управляющем файле:

LOAD DATA INFILE * INTO TABLE DEPT REPLACE

FIELDS TERMINATED BY X09

(DEPTNO, DNAME,

BEGINDATA

10 Sales Virginia

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

tkyte@TKYTE816> select * from dept;

DEPTNO DNAME LOC

10 Sales

В данном случае, как только утилита SQLLDR обнаруживает символ табуляции, она выдает значение. Поэтому значение 10 присвоено столбцу DEPTNO, а в столбце DNAME оказалось значение Null, поскольку после первого символа табуляции никаких данных не б1ло, сразу стоял следующий символ табуляции. Значение Sales попало в столбец LOC.

Так и должны работать конструкции TERMINATED BY WHITESPACE и TERMINATED BY <символ>. Загружаемые данные и способ их интерпретации определяют, какую из них использовать.

При загрузке данных с разделителями такого вида часто необходимо пропустить некоторые столбцы загружаемых записей. Например, может потребоваться загрузить столбцы 1, 3 и 5, пропустив столбцы 2 и 4. Для этого утилита SQLLDR предлагает ключевое слово FILLER. Оно позволяет сопоставить столбец полю входной записи, но не помещать его в базу данных. Например, можно загрузить в представленную ранее таблицу DEPT данные, содержащие четыре поля, с использованием следующего управляющего файла, не помещающего второе поле в базу данных:

LOAD DATA INFILE * INTO TABLE DEPT REPLACE

FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY ( DEPTNO,

FILLER 1 FILLER, DNAME,




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

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