![]() |
|
Программирование >> Oracle
Загрузка данных 477 файла. Поскольку все это организовать непросто (найти самый большой делитель размера файла, не превышающий 64 Кбайт и т.д.), я написал небольшую переносимую программу на языке С, которая делает это автоматически. Мне часто приходится загружать содержимое файлов в столбцы типа LONG или LONG RAW и одновременно с этим заполнять другой столбец - первичный ключ. Поэтому я использую эту программу для создания управляющих файлов наподобие представленного выше. Она используется следующим образом: genctl иия файла иия таблиц1 иия цпинного столбца имя столбца первичного ключа значение первичного ключа liW CIER и для получения представленного выше управляющего файла я вызвал ее так: genctl mydata.dat foo bigdata id 1 lW > test.ctl Программа определила размер файла MYDATA.DAT, вычислила размер физической записи и автоматически сгенерировала соответствующий управляющий файл. Исходный код программы GENCTL можно найти на Web-сайте издательства Wrox по адресу http: www.wrox.com. Загрузка данных, содержащих символы новой строки Загрузка данных, которые включают символ новой строки, всегда была проблематичной в SQLLDR. Символ новой строки является стандартным признаком конца записи для SQLLDR, и обходные пути загрузки в прежних версиях не давали требуемой гибкости. К счастью, в Oracle 8.1.6 и более поздних версиях появились новые варианты работы с такими данными. Теперь загружать данные, содержащие символы новой строки, можно следующими способами: загружать данные, в которых вместо символа новой строки подставлена другая последовательность символов, представляющая новую строку (например, поместить в текст подстроку \п вместо символов новой строки), и заменять этот текст вызовом CHR(10) с помощью SQL-функции в ходе загрузки; использовать атрибут FIX директивы INFILE и загружать файл в виде записей фиксированной длины; использовать атрибут VAR директивы INFILE и загружать файл в виде записей переменной длины, в которых первые несколько байтов каждой записи содержат длину записи; использовать атрибут STR директивы INFILE и загружать файл в виде записей переменной длины, в которых конец записи представлен заданной последовательностью символов, а не символом новой строки. Мы продемонстрируем все эти способы. 478 Глава 9 Использование другого символа вместо символа новой строки Это - простой метод, если можно управлять генерацией загружаемых данных. Если данные можно легко преобразовать в требуемый формат при создании файла данных, этот способ прекрасно подходит. Идея в том, чтобы применять к данным SQL-функ-цию при загрузке в базу данных, заменяя некоторую строку символов символом новой строки. Давайте добавим еще один столбец в таблицу DEPT: tkyte@TKYTE816> alter table dept add comments varchar2(4000); Table altered. Мы будем использовать этот столбец для загрузки в него текста. Вот как может выглядеть управляющий файл, содержащий встроенные данные: LOAD DATA INFILE * INTO TABLE DEPT REPLACE FIELDS TERMINATED BY , TRAILING NULLCOLS (DEPTNO, DNAME upper(:dname) , LOC upper(:loo) , LAST UPDATED my to date(:last updated) , COMMENTS replace(:comments, \n, chr(10)) BEGINDATA 10,Sales,Virginia,01-april-2001,This is the Sales\nOffice in Virginia 20,Accounting,Virginia,13/04/2001,This is the Accounting\nOffice in Virginia 30,Consulting,Virginia,14/04/2001,This is the Consulting\nOffice in Virginia 40,Finance,Virginia,987268297,This is the Finance\nOffice in Virginia Хотелось бы обратить внимание на одну важную вещь. Представленный выше управляющий файл будет работать только на DOS-совместимых платформах, таких как Windows NT. На платформе UNIX необходимо использовать такое описание поля комментариев: COMMENTS replace(:comments, \\n, chr(10)) Обратите внимание, что при вызове функции replace пришлось использовать \\n, a не просто \n, поскольку в UNIX утилита SQLLDR распознает \n как символ новой строки, а не строку из двух символов. Мы использовали конструкцию \\n для получения строковой константы \n в управляющем файле утилиты SQLLDR на платформе UNIX. При запуске утилиты SQLLDR с представленным выше управляющим файлом (при необходимости измененным соответствующим образом для работы в ОС UNIX), в таблицу DEPT будут загружены следующие данные: tkyte@TKYTE816> select deptno, dname, comments from dept; Загрузка данн1х DEPTNO DNAME COMMENTS Office in Virginia 20 ACCOUNTING This is the Accounting Office in Virginia 30 CONSULTING This is the Consulting Office in Virginia 40 FINANCE This is the Finance Office in Virginia Использование атрибута FIX Для решения задачи можно также использовать атрибут FIX. Для его использования загружаемые данные должны быть представлены в виде записей фиксированной длины. В каждой записи входного набора данных будет одно и то же количество байтов. Это особенно подходит для данных в фиксированных позициях. Именно эти данные обычно состоят из записей фиксированной длины. При использовании данных в свободном формате , с разделителями, маловероятно, что записи будут иметь одинаковую длину (смысл использования данных с разделителями в том, чтобы каждая запись имела именно такой размер, какой необходим для размещения ее данных). При использовании атрибута FIX необходимо указывать конструкцию INFILE, поскольку атрибут этот относится к конструкции INFILE. Кроме того, данные при этом должны находиться во внешнем файле, а не в управляющем. Итак, предполагая, что данные представлены в виде записей фиксированной длины, получаем следующий управляющий файл: LOAD DATA INFILE demo17.dat fix 101 INTO TABLE DEPT REPLACE FIELDS TERMINATED BY , TRAILING NULLCOLS (DEPTNO, DNAME upper(:dname) , LOC upper(:loc) , LAST UPDATED my to date(:last updated) , COMMENTS Здесь указано, что файл данных будет состоять из записей длиной 101 байт. В запись включается завершающий символ новой строки, если он есть. В данном случае символ новой строки не имеет специального значения в файле данных. Это просто еще один символ, который надо (или не надо) загружать. Это надо понять - символ новой строки в конце записи (если он там есть) будет частью записи. Чтобы глубоко это осознать, необходима утилита для представления содержимого файла на экране в таком виде, чтобы можно было увидеть фактические данные. Чтобы такая утилита была переноси-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |