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