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

1 ... 152 153 154 [ 155 ] 156 157 158 ... 469


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

( (6)

EMPNO char(44) , (7)

ENAME char(20) , (В)

JOB char(18), (9)

MGR char(44) , (lO)

HIREDATE date ddmmyyyyhh24miss, (11)

SAL char(44), (12)

COMM char(44) , (13)

DEPTNO char(44), (14)

RESUME char(4000) (15)

) (16)

Хотелось бы обратить внимание на следующее.

Строка (2). Используется новое средство Oracle 8.1.6, атрибут STR. Можно указать, какой символ или какая строка используется как признак конца записи. Это позволяет загружать данные со встроенными символами перевода строк. Указанная в1ше строка x7E0D0A - это просто тильда, за которой идут символы новой строки.

О Строка (5). Используются заданные разделители и кавычки. Я не использую конструкцию OPTIONALLY ENCLOSED BY, поскольку в кавычки, после удвоения соответствующих символов в данных, будет заключаться каждое поле.

Строка (11). Используется длинный числовой формат даты. Последствия этого двояки. Во-первых, решаются проблемы NLS для дат, а во-вторых, в полях дат сохраняется компонент времени.

Строка (15). Используются данные типа char(4000). По умолчанию утилита

SQLLDR будет использовать для полей тип данных char(255). Я удвоил длину каждого поля в управляющем файле. Это гарантирует, что утилита SQLLDR сможет прочитать данные без усечения полей. Удвоение сделано для поддержки дан-н1х типа RAW, которые мы получаем в формате VARCHAR2 (в шестнадцатерич-ном виде). Т.е. каждый байт исходных данных представляется двумя символами.

Представленный выше код генерирует следующий файл данных (с расширением .dat): 7369 , SM

, ITH ,CLERK , 7902 , 17121980000000 , 800 20 , 02020202020202020202020202 0202020202020202020...<существенная часть удалена> ...0202020202020202 ~ 7499 , AL

LEN , SALESMAN , 7698 , 20021981000000 , 1600 , 300 , 30 , 020202020202020202 02020202020202020202...Существенная часть удалена> ...0202020202020202 ~

Обратите внимание на следующее в этом файле данных.

Каждое поле взято в указанные кавычки.

Поле ENAME, в которое мы с помощью оператора UPDATE внесли кавычки и символ \n, содержат встроенный перевод строки. Кроме того, символы кавычек удвоены, чтобы они остались в данных после загрузки.

Данные типа DATE выгружены в виде больших чисел.



496 Глава 9

Добавленные поля типа RAW сохранились и выданы в шестнадцатиричном виде.

Каждая запись в файле завершается тильдой (~), как и требовалось.

Теперь легко загрузить эти данные с помощью утилиты SQLLDR. При вызове SQLLDR можно добавить необходимые опции командной строки.

Эту функцию можно использовать для решения задач, которые сложно или невозможно решить по-другому. Например, если необходимо переименовать столбец ENAME в таблице ЕМР в EMP NAME, можно сделать так, как показано ниже. Выгружаем данные для последующей загрузки с помощью SQLLDR. Обратите внимание, как мы переименовываем столбец, задав псевдоним EMP NAME в списке выбора оператора SELECT после ENAME. В результате управляющий файл будет создан со столбцом EMP NAME вместо ENAME. Затем я удаляю данные из таблицы, удаляю неправильно названный столбец и добавляю столбец с новым именем. После этого данные загружаются обратно в таблицу. Этот подход предпочтительней по сравнению с более простым: добавить столбец, изменить его данные, взяв их из старого, удалить старый столбец , если таблицу надо коренным образом реорганизовывать или объем данных в сегментах отката и журнале повторного выполнения, генерируемых при подобной операции, имеет значение. Можно вызвать утилиту SQLLDR в режиме непосредственной загрузки и вообще избежать генерации данных отката и повторного выполнения при загрузке. Вот как это делается, по шагам:

tkyte@TKYTE816> declare

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

l rows

begin

l rows

number;

unloader.run (p query

p tname

p mode P dir

p filename p separator p enclosure p terminator =>-);

=> => => => => =>

select EMPNO, ENAME EMP NAME,

JOB , MGR, HIREDATE,

SAL, COMM, DEPTNO from emp order by empno , emp , TRUNCATE, o:\temp1, emp ,

dbms output.put line(to char(l rows)

rows extracted

to ascii file);

end;

PL/SQL procedure successfully completed. tkyte@TKYTE816> truncate table emp; Table truncated.

tkyte@TKYTE816> alter table emp drop column ename;

=>



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

Table altered.

tkyte@TKYTE816> alter table emp add emp name varchar2 (10) ,-Table altered.

tkyte@TKYTE816> host sqlldr userid=tkyte/tkyte control=c:\temp\emp.ctl SQLLDR: Release 8.1.6.0.0 - Production on Sat Apr 14 20:40:01 2001 (c) Copyright 1999 Oracle Corporation. All rights reserved. Commit point reached - logical record count 14

tkyte@TKYTE816> Name

EMPNO

JOB MGR

HIREDATE

COMM

DEPTNO

RESUME

EMP NAME

desc emp

Null?

NOT NOLL

Type

NUMBER (4) VARCHAR2(9) NUMBER(4) DATE

NUMBER(7,2) NUMBER(7,2)

NUMBER(2) RAH(2000) VARCHAR2(10)

tkyte@TKYTE816> select emp name from emp;

EMP NAME

ITH

MI LLER

14 rows selected.

Этот метод можно использовать и для выполнения других операций, скажем, для изменения типа данных, их денормализации (выгрузки результатов соединения, например) и т.д.

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



1 ... 152 153 154 [ 155 ] 156 157 158 ... 469

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