|
Программирование >> Oracle
Глава 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
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
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |