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

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


Глава 9

текстовом редакторе или с помощью утилит командной строки, поскольку каждая запись по-прежнему завершается символом новой строки. Атрибут STR задается в шест-надцатеричном виде, а автоматически преобразовать строку в шестнадцатеричный вид проще всего с помощью SQL и пакета UTL RAW (подробнее о пакете UTL RAW см. в приложении о стандартно поставляемых пакетах в конце книги). Например, при работе в Windows NT, где признаком конца строки является последовательность CHR(13) CHR(10) (возврат каретки/перевод строки), а в качестве специального маркера выбран символ конвейера, , можно преобразовать строку так:

tkyte@TKYTE816> select utl raw.cast to raw(chr(13)chr(10)) from dual;

UTL RAW.CAST TO RAW(CHR(13)CHR(10)) 7C0D0A

В качестве значения атрибута STR надо задать X7C0D0A . Для загрузки можно создать управляющий файл следующего вида:

LOAD DATA

INFILE demo20.dat str X7C0D0A

INTO TABLE DEPT REPLACE

FIELDS TERMINATED BY TRAILING NULLCOLS

(DEPTNO,

DNAME upper(:dname) ,

LOC upper(:loc) ,

LAST UPDATED my to date(:last updated) ,

COMMENTS

Если загружаемые данные имеют следующий вид:

C:\sqlldr>type demo20.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

так что каждая запись данных завершается последовательностью \r\n, то с помощью представленного выше управляющего файла их можно корректно загрузить.

Как упростить обработку символов новой строки

Итак, мы рассмотрели четыре способа загрузки данных со встроенными символами новой строки. В следующем разделе мы используем один из них, атрибут STR, при со-



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

здании универсальной утилиты выгрузки данных, полностью решающей проблему с символами новой строки в текстах.

Кроме того, всегда надо учитывать, как я уже упоминал в предыдущих примерах, что в Windows (во всех версиях), текстовые файлы могут завершаться символами \r\n (ASCII-код 13 + ASCII-код 10, возврат каретки /перевод строки). В управляющем файле (в задаваемом для атрибутов FIX и VAR количестве байтов, а также в строке значения для атрибута STR) должно быть учтено, что символ \r является частью записи. Например, если взять любой из представленных выше файлов данных, содержащих символы \r\n, и передать их по протоколу FTP на ОС UNIX в стандартном текстовом (ASCII) режиме, каждая пара символов \r\n будет преобразована в \n. Управляющий файл, только что работавший в Windows, уже не позволит загрузить данные. Об этом надо всегда помнить при создании управляющего файла.

Выгрузка данных

Утилита SQLLDR, да и вообще ни одно из поставляемых в составе СУБД Oracle инструментальных средств, не позволяет выгрузить данные в формате, подходящем для загрузки с помощью SQLLDR. Это можно использовать при переносе данных из одной системы в другую без применения утилит ЕХР/IMP. Утилиты EXP/IMP позволяют эффективно переносить средние объемы данных из одной системы в другую. Поскольку утилита IMP не обеспечивает непосредственный импорт и не позволяет распараллелить построение индексов, перенос данных с помощью SQLLDR с последующим параллельным созданием индексов без журнализации может выполняться на несколько порядков быстрее.

Создадим небольшую утилиту на языке PL/SQL, которую можно будет использовать для выгрузки данных на сервере в формате, подходящем для загрузки с помощью SQLLDR. Кроме того, аналогичные средства на базе Рго*С и утилиты SQL*Plus представлены на Web-сайте издательства Wrox. Утилита на PL/SQL подходит для большинства случаев, но реализация на Рго*С обеспечивает более высокую производительность, а также пригодится, если необходимо сгенерировать файлы данных на клиенте (а не на сервере, где их будет генерировать PL/SQL-утилита).

Создаваемый пакет имеет следующую спецификацию:

tkyte@TKYTE816> create or replace package unloader

function run(p query

in varchar2,

p tname

in varchar2,

p mode

in varchar2 default

REPLACE,

p dir

in varchar2,

p filename

in varchar2,

p separator

in varchar2 default

, ,

p enclosure

in varchar2 default

p terminator

in varchar2 default

return number;

end;

Package created.



488 Глава 9

Параметры функции имеют следующее назначение:

/* Функция run - выгружает результаты запроса в файл и создает

управляющий файл для загрузки этих данных в другую таблицу

p query = SQL-запрос для выгрузки . Запрос может быть практически

любым.

p tname = Таблица, в которую надо загружать данные. Это имя будет

указано в управляющем файле.

p mode = REPLACEAPPENDTRUNCATE - способ загрузки данных

p dir = Каталог, в который будут записаны файлы .ctl и .dat.

p filename = Имя файла, в который надо записывать. Я добавляю к этому имени суффиксы .ctl и .dat

p separator = Разделитель полей, по умолчанию - запятая.

p enclosure = Символ, в который заключается каждое поле.

p terminator= Признак конца строки. Мы будем использовать его, чтобы можно было выгружать и затем загружать данные со встроенными символами новой строки. Стандартное значение - \n (символы конвейера и перевода строки); для NT можно использовать \r\n. Это значение надо изменять, только если точно известно, что оно есть в загружаемых данных. Я всегда добавляю в конце последовательности символы конца строки для соответствующей ОС, но это не обязательно.

Тело пакета представлено ниже. Для создания управляющего файла и файла данных используется пакет UTL FILE. He забудьте почитать о настройке пакета UTLFILE в Приложении А. Если не установить соответствующим образом параметр в файле init.ora, пакет UTL FILE работать не будет. Для динамического выполнения любого запроса используется пакет DBMS SQL (подробнее о нем см. в соответствующем разделе приложения). В запросах используется один тип данных - VARCHAR2(4000). Поэтому этот метод нельзя использовать для выгрузки больших объектов размером более 4000 байт. Но выгружать до 4000 байт любого большого объекта с помощью функции DBMS LOB.SUBSTR все же можно. Кроме того, поскольку в качестве единственного типа результатов используется VARCHAR2, мы можем обрабатывать столбцы типа RAW длиной до 2000 байт (4000 шестнадцатиричных цифр) - этого вполне достаточно для всех данных, кроме данных типа LONG RAW и больших двоичных объектов. Представленный ниже пакет решает проблему в 90 процентах случаев. Немного потрудившись и используя другие средства, описанные в книге, например пакет LOB IO, представленный в главе 18, можно расширить его для поддержки всех типов данных, в том числе больших объектов любого размера.

tkyte@TKYTE816> create or replace package body unloader

2 as 3 4

5 g theCursor integer default dbms sql.open cursor;

6 g descTbl dbms sql.desc tab;

7 g nl varchar2(2) default chr(10); 8



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

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