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

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 и