DBMS_L0B.CLOSE(v_src_bfile);
DBMS_OUTPUT.PUT_LINE('Copy successfully completed.') ;
ELSE
DBMS_OUTPUT.PUT_LINE(' File does not e x is t ');
END IF;
END copy_bfile_data_to_clob;
/
Следующий пример вызывает copy_bf ile_data_to_clob() для копирования
содержимого BFILE-#1*b н о в ы й CL0B с идентификатором 4:
□ CALL copy_bfile_data_to_clob(1, 4);
Copy successfully completed.
Следующий пример вызывает copy_clob_data_to_file() для копирования
содержимого CL0B #4 в новый файл по имени textContent3.txt:
□ CALL copy_clob_data_to_file(4, ‘ SAMPLE_FILES_DIR’ , ‘ textContent3.txt’ );
Copy successfully completed.
Если вы посмотрите папку C:\sample_files, вы обнаружите там новый
файл textContent3.txt. Этот файл содержит текст, идентичный
textContent.txt.
Следующая процедура copy_bf ile_data_to_blob() показывает, как читать
двоичные данные из BFILE и сохранять их в BLOB:
□ CREATE PROCEDURE copy_bfile_data_to_blob(
p_bfile_id INTEGER,
p_blob_id INTEGER
) AS
v_src_bfile BFILE;
v_directory VARCHAR2(200);
v_filename VARCHAR2(200);
v_length INTEGER;
v_dest_blob BLOB;
v_amount INTEGER := DBMS_L0B.LOBMAXSIZE;
v_dest_offset INTEGER := 1;
v_src_offset INTEGER := 1;
BEGIN
--получим локатор для BFILE
SELECT bfile_column
INTO v_src_bfile
FROM bfile_content
Глава 14
WHERE id = p _ b file _ id ;
- используем FILEEXISTSO для проверки существования файла
- (FILEEXISTSO возвращает 1, если файл существует)
IF (DBMS_L0B.FILEEXISTS(v_src_bfile) = 1) THEN
- используем 0PEN() для открытия файла
DBMS_L0B.O P E N (v _ s rc _ b file );
- используем FILEGETNAME(), чтобы получить имя файла и
- каталога
DBMS_L0B.FILEGETNAME(v_src_bfile, v _ d ire c to ry , v_filen ame);
DBMS_OUTPUT.PUT_LINE('Directory = ' || v _ d ir e c to r y ) ;
DBMS_OUTPUT.PUT_LINE(' Filename = ' II v_filen ame);
- добавим пустой 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; „
- используем L0ADBL0BFR0MFILEO, чтобы получить до v_amount байт
- из v _ s r c _ b f ile и сохраним их в v_dest_blob, начиная
- с o f f s e t 1 в v _ s r c _ b f ile и v_dest_blob
DBMS_L0B.LOADBLOBFROMFILE(
v_dest_blob, v _ s r c _ b file ,
v_amount, v _ d e s t_ o ffs e t, v _ s rc _ o ffs e t
- используем CLOSEO для закрытия v _ s r c _ b f ile
DBMS_L0B.CLOSE(v_src_bfile);
DBMS_OUTPUT.PUT_LINE('Copy s u c c e s s fu lly c om p le te d .');
ELSE
DBMS_OUTPUT.PUT_LINE(' F ile does not e x is t );
END IF;
END cop y_ b file _ d a ta _ to _ b lo b ;
Следующий пример вызывает c o p y _ b file _ d a ta _ to _ b lo b () для копирования
содержимого BFILE #2 в новый BLOB с идентификатором 4:
□ CALL co p y _ b file _ d a ta _ to _ b lo b (2 , 4);
Copy s u c c e s s fu lly completed.
Следующий пример вызывает c o p y _ b lo b _ d a ta _ to _ file () для копирова
ния содержимого BLOB #4 в новый файл по имени binaryContent3.doc:
D CALL c o p y _ b lo b _ d a ta _ to _ file (4 , ‘SAMPLE_FILES_DIR’ , ‘ binaryContent3.
doc’ );
Copy s u c c e s s fu lly completed.
Если вы посмотрите папку C:\sample_files, то обнаружите там новый
файл binaryContent3.doc. Этот файл содержит данные, идентичные
binaryContent.doc.
Большие объекты 537
На это мы закончим изучение больших объектов. В следующем разделе
вы ознакомитесь с типами LONG и LONG RAW.
Типы LONG и LONG RAW
В самом начале этой главы я уже говорил о том, что предпочтительным
способом хранения больших блоков данных являются большие двоичные
объекты (L0B). Но можно столкнуться с более старыми базами данных, где
до сих пор используются следующие типы:
■ LONG. Используется для хранения вплоть до 2 Гбайт символьных данных
■ LONG RAW. Используется для хранения вплоть до 2 Гбайт двоичных
данных
■ RAW. Используется для хранения вплоть до 4 Кбайт двоичных данных.
В этом разделе вы увидите, как использовать типы LONG и LONG RAW. Тип
RAW может быть использован точно так же, как и тип LONG RAW, поэтому он
не рассматривается.
Таблицы примеров
В этом разделе для примеров будут использованы следующие таблицы:
■ long_content Содержит столбец LONG_column типа LONG,
■ long_raw_content Содержит столбец LONG_raw_column типа LONG RAW.
Эти таблицы создаются сценарием lob_schema. sq! посредством следующих
выражений:
□ CREATE TABLE long_content (
id INTEGER PRIMARY KEY,
long_column LONG NOT NULL
);
CREATE TABLE long_raw_content (
id INTEGER PRIMARY KEY,
long_raw column LONG RAW NOT NULL
);
Добавление данных в столбцы LONG и LONG RAW
Следующие операторы INSERT добавляют строки в таблицу LONG_content:
□ INSERT INTO long_content (
id, long_column
) VALUES (
1, ‘ Creeps in this petty pace’
);
INSERT INTO long_content (
id, long_column
) VALUES (
2, ‘ from day to day’
);
538 Глава 14
Следующий оператор INSERT добавляет строки в таблицу L0NG_raw_
content (первый INSERT с о д е р ж и т двоичное число, второй-16-ричное):
П INSERT INTO long_raw_content (
id, long_raw_column
) VALUES (
1 , ‘ 1 001 1 1 0 1 0 1 0 1 0 1 1 1 1 1 ’
);
INSERT INTO long_raw_content (
id, long_raw_column
) VALUES (
2, ' A0FFB71CF90DE’
);
В следующем разделе вы увидите, как преобразовать столбцы LONG и