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

1 ... 154 155 156 [ 157 ] 158 159 160 ... 469


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

15 end;

16 /

declare *

ERROR at line 1:

ORA-22285: non-existent directory or file for FILEOPEN operation ORA-06512: at SYS.DBMS LOB , line 475

ORA-06512: at line 9

Причина в том, что каталог dirl не существует, a DIR1 - есть. Если вы предпочитаете использовать в именах каталогов символы разных регистров, необходимо при создании соответствующих объектов использовать идентификаторы в кавычках, как я и сделал для каталога dir2. Это позволит писать код следующего вида:

ops$tkyte@DEV816> declare

2 l clob clob;

3 l bfile bfile;

4 begin

5 insert into demo values (2, emptyclob())

6 returning theclob into l clob; 7

8 l bfile := bfilename (dir2, test.txt);

9 dbms lob.fileopen(l bfile);

11 dbms lob.loadfromfile(l clob, l bfile,

12 dbms lob.getlength(l bfile));

14 dbms lob.fileclose(l bfile);

15 end;

16 /

PL/SQL procedure successfully completed.

Помимо LOADFROMFILE есть и другие методы, с помощью которых можно наполнять данными столбцы типа LOB в PL/SQL. LOADFROMFILE - самое простое решение, если необходимо загрузить весь файл. Если же необходимо обрабатывать содержимое файла в процессе загрузки, можно также применять к объекту BFILE функцию DBMS LOB.READ для чтения из него данных. Функция UTL RAW.CAST TO VARCHAR2 удобна при чтении данных, являющихся текстовыми, а не двоичными. Подробнее о пакете UTL RAW см. в Приложении А. Затем можно использовать вызовы DBMS LOB.WRITE или WRITEAPPEND для записи данных в столбец типа CLOB или BLOB.

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

Теперь разберемся, как загружать данные больших двоичных объектов с помощью утилиты SQLLDR. Для этого существует несколько методов, но мы рассмотрим только два наиболее популярных:

загрузка данных, находящихся в том же файле, что и основные;



502 Глава 9

загрузка данных, хранящихся в отдельных файлах, имена которых указаны в записях файла данных. Такие файлы в SQLLDR принято называть вторичными файлами данных (Secondary Data Files - SDF).

Начнем с данных, находящихся в том же файле, что и основные.

Загрузка данных больших объектов из того же файла

В таких больших объектах, как правило, содержатся встроенные символы новой строки и другие специальные символы. Поэтому почти всегда придется использовать один из четырех рассмотренных ранее методов загрузки данных с символами новой строки. Давайте изменим таблицу DEPT так, чтобы столбец COMMENTS стал типа CLOB, а не VARCHAR2:

tkyte@TKYTE816> truncate table dept;

Table truncated.

tkyte@TKYTE816> altar table dept drop column comments; Table altered.

tkyte@TKYTE816> alter table dept add comments clob; Table altered.

Пусть имеется файл данных (demo21.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, it has embedded commas and is much longer than the other comments field. If you feel the need to add double quoted text in here like this: You will need to double up those quotes! to preserve them in the string. This field keeps going for up to 1000000 bytes or until we hit the magic end of record marker, the followed by a end of line - it is right here ->

Каждая запись завершается символом конвейера (), за которым идет маркер конца строки. Как видите, текст для отдела 40 намного длиннее, чем для остальных отделов, содержит много переводов строк, кавычки и запятые. Имея такой файл данных, я могу создать управляющий файл следующего вида:

LOAD DATA

INFILE demo21.dat str X7C0D0A INTO TABLE DEPT

REPLACE

FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY TRAILING NULLCOLS (DEPTNO,



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

DNAME upper(:dname) ,

LOC upper(:loc) ,

LAST UPDATED my to date(:last updated ) ,

COMMENTS char(1000000)

Этот пример взят из ОС Windows, в которой строка завершается двумя байтами - отсюда и значение атрибута STR вуправляющем файле. ВОСUNIXнадо использовать значение 7С0А.

Для загрузки файла данных я указал тип CHAR(1000000) для поля COMMENTS, поскольку по умолчанию утилита SQLLDR использует для полей данных тип CHAR(255). Тип CHAR(1000000) позволит SQLLDR принимать до 1000000 байт данных. Необходимо указать размер, заведомо превышающий предполагаемую длину текста в поле загружаемого файла. Посмотрим на загруженные данные:

tkyte@TKYTE816> select comments from dept;

COMMENTS

This is the Accounting Office in Virginia

This is the Consulting Office in Virginia

This is the Finance

Office in Virginia, it has embedded commas and is

much longer then the other comments field. If you

feel the need to add double quoted text in here like

this: You will need to double up those quotes! to

preserve them in the string. This field keeps going for upto

1,000,000 bytes or until we hit the magic end of record marker,

the followed by a end of line - it is right here ->

This is the Sales Office in Virginia

Обратите внимание, что сдвоенные кавычки теперь стали одинарными. Утилита SQLLDR удалила лишние кавычки в ходе загрузки.

Загрузка данных больших объектов из внешних файлов

Достаточно часто используется файл данных, содержащий имена файлов, которые необходимо загрузить в большие объекты. Так можно избежать смешивания в одном файле данных больших объектов со структурированными данными. Это дает дополнительную гибкость, поскольку в файле данных не надо применять один из четырех методов обхода проблемы встроенных символов новой строки, которые часто встречаются в больших текстах или двоичных данных. Такие дополнительные файлы данных в SQLLDR называются LOBFILE.



1 ... 154 155 156 [ 157 ] 158 159 160 ... 469

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