Выбрать главу

v _ f ile := UTL_FILE.FOPEN( p _ d ire c to r y , p_file_name, ' r ' , v_amount);

- скопируем данные из файла в v_de st_clob по одной строке за операцию

LOOP

BEGIN

- прочитаем строку из файла в v_char_b uffer;

- GET_LINE() не копирует символ новой строки в

- v_ch a r_b u ffe r

UTL_FILE.GET_LINE(v_file, v _ c h a r_ b u ffe r);

v_chars_read := LENGTH(v_char_buffer);

- добавим строку к v_de st_clob

DBMS_L0B.WRITEAPPEND(v_dest_clob, v_chars_read, v _ c h a r_ b u ffe r);

- добавим новую строку к v_de st_clob из-за v_char_b uffer;

- значение ASCII для символа новой строки равно 10, поэтому CHR(10)

возвращает

- символ новой строки

DBMS_L0B.WRITEAPPEND(v _ d e s t_ c lo b , 1, CHR(10))■

EXCEPTION

- елси в файле больше нет данных, то выйти

WHEN N0_DATA_F0UND THEN

EXIT;

END;

END LOOP;

- закрываем файл

U T L_F ILE .FCLO SE (v_ file);

DBMSJDUTPUT.PUT_LINE('Copy s u c c e s s fu lly c om p le te d .');

END co p y _ file _ d a ta _ to _ c lo b ;

/

530 Глава 14

Есть ряд замечаний относительно этой процедуры.

■ Пакет UTL_FILE представляет собой пакет в составе базы данных, который

содержит методы и типы, позволяющие вам читать и записывать

файлы. Например, UTL_FILE. FILE_TYPE является объектным типом,

который используется для представления файла.

■ Переменная v_amount установлена в 32767, что является максимальным

числом символов, которые можно прочитать из файла в течение

каждой операции чтения.

■ Переменная v_char_bliffer используется для хранения результатов,

прочитанных из файла, до того, как они будут добавлены к v_dest_

clob. Максимальный размер v_char_buffer установлен на 32767; этот

размер достаточен для хранения максимального числа символов, читаемых

из файла во время каждой операции чтения.

■ Процедура UTL_FILE.F0PEN(directory, file_name, open_mode, amount)

открывает файл; open_mode может быть установлен в одно из следующих

значений:

■ г для чтения текста.

■ w для записи текста.

■ а для добавления текста.

■ rb для чтения байтов.

■ wb для записи байтов.

■ ab для добавления байтов.

Процедура UTL_FILE.GET_LINE(v_file, v_char_buffer) получает строку

текста из v_flle в v_char_buffor. GET_LINE() не добавляет новую строку в v_

char_buffer; поскольку мне нужна новая строка, я добавляю её при помощи

DBMS_LOB.WRITEAPPEND(v_dest_clob, 1, CHR(10)).

Следующий пример вызывает copy_file_data_to_clob() для копирования

содержимого файла textContent.txt в новый CL0B с идентификатором 3:

П CALL copy_file_data_to_clob(3, ' SAMPLE_FILES_DIR', 'textContent.txt’ );

Copy successfully completed.

Следующая процедура copy_file_data_to_blob() показывает, как читать

двоичные данные из файла и сохранять их в BLOB. Обратите внимание, что

для хранения двоичных данных, прочитанных из файла, используется

массив RAW:

□ CREATE PROCEDURE copy_file_data_to_blob(

p_blob_id INTEGER,

p_directory VARCHAR2,

p_file_name VARCHAR2

) AS

v _ f ile UTL_FILE.FILE_TYPE;

v_bytes_read INTEGER;

v_dest_blob BLOB;

v_amount INTEGER := 32767;

v_binary_buffer RAW(32767);

Большие объекты 531

BEGIN

- добавляем пустой BLOB

INSERT INTO blob_content(

id, blob_column

) VALUES (

p_blob_id, EMPTY_BLOB()

);

- получаем локатор LOB для BLOB

SELECT blob_column

INTO v_dest_blob

FROM blob_content

WHERE id = p_blob_id

FOR UPDATE;

открываем файл для чтения байтов (вплоть до v_amount байтов за один

раз)

v _ f ile := UTL_FILE.FOPEN( p_directory, p_file_name, 'rb ', v_amount);

- копируем данные из файла в v_dest_blob

LOOP

BEGIN

- читаем двоичные данные из файла в v_binary_buffer

UTL_FILE.GET_RAW(v_file, v_binary_buffer, v_amount);

v_bytes_read := LENGTH(v_binary_buffer);

- добавляем v_binary_buffer к v_dest_blob

DBMS_L0B.WRITEAPPEND(v_dest_blob, v_bytes_read/2,

v_binary_buffer);

EXCEPTION

- выйти, если в файле больше нет данных

WHEN N0_DATA_FOUND THEN

EXIT;

END;

END LOOP;

- закрываем файл

UTL_FILE.FCLOSE(v_file);

DBMS_OUTPUT.PUT_LINE('Copy successfully completed.');

END copy_file_data_to_blob;

/

Следующий пример вызывает copy_file_data_to_blob() для копирования

содержимого файла binaryContent.doc в новый BLOB с идентификатором

3:

□ CALL copy_file_data_to_blob(3, ' SAMPLE_FILES_DIR', 'binaryContent.doc');

Copy successfully completed.

Разумеется, copy_file_data_to_blob() можно использовать для записи

любых двоичных данных из файла в BLOB. Двоичные данные могут содержать

музыку, видео, изображения, исполняемые файлы и т.п. Попробуйте

использовать свои файлы.

Подсказка Вы можете также загрузить данные в L0B при помощи Oracle SQL*Loader и

утилит Data Pump; см. руководство Oracle Database Large Objects Developer’s Guide (руководство

разработчика больших объектов базы данных Oracle), публикуемое корпорацией Oracle.

532 Глава 14

Копирование данных из C LO B и B LO B в ф айл

Следующая процедура c o p y _ c lo b _ d a ta _ to _ file ( ) показывает, как читать

текст из CL0B и сохранять его в файл:

□ CREATE PROCEDURE co p y _ c lo b _ d a ta _ to _ file (

p_ clob_ id INTEGER,

p _ d ire c to ry VARCHAR2,

p_file_name VARCHAR2