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