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

g e t_ b lo b _ lo ca to r(v_ b lo b , p_id);

— прочитаем содержимое v_blob в v _ b in a ry _ b u ffe r, начиная с

- - позиции v _ o ffs e t и в количестве v_arnount байт

DBHS_L0B.READ(v _ b lo b , v_amount, v _ o ffs e t, v _ b in a ry _ b u ffe r) ;

— отобразим содержимое v _ b in a ry _ b u ffe r

DBMS_OUTPUT.PUT_LINE(' v_binary_buffer = ’ II v_binary_buffer);

DBMS_OUTPUT.PUT_LINE(1v_amount = ’ I I v_amount);

END read_blob_example;

/

Следующий пример вызывает read_blob_exarnple():

□ CALL read_blob_example(1);

v_ b in a ry _ b u ffe r = 100111010101011111

v amount = 9

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

Запись в C LO B

Следующая процедура write_example() записывает строку из v_char buffer

в v_clob при помощи WRITE(). Обратите внимание, что выражение SELECT в

процедуре использует оператор FOR UPDATE, который применяется, потому

что запись в CL0B производится при помощи WRITE():

□ CREATE PROCEDURE write_example(

p_id IN INTEGER

) AS

v_clob CLOB;

v_offset INTEGER := 7;

v_amount INTEGER := 6;

v_char_buffer VARCHAR2(10) := ' pretty’ -

BEGIN

— получим локатор LOB в v_clob для выполнения обновления (для обновления,

— потому что позже запись в L0B выполняется при помощи WRITEO )

SELECT clob_column

INTO v_clob

FROM clob_content

WHERE id = p_id

FOR UPDATE;

-- прочитаем и отобразим содержимое CLOB

read_clob_example(p_id);

— запишем символы из v_char_buffer в v_clob, начиная

с позиции v_offset и общим числом v_amount символов

DBMS_LOB.WRITE(v_clob, v_amount, v_offset, v_char_buffer);

-- прочитаем и отобразим содержимое CL0B

-- а затем откатим запись

read_clob_example(p_id);

ROLLBACK;

END write_example;

/

Следующий пример вызывает write_example():

□ CALL write_example(1);

v_char_buffer = Creeps in this petty pace

v_amount = 25

v_char_buffer = Creepsprettyis petty pace

v_amount = 25

Добавление данных в C LO B

Следующая процедура append_example() использует APPEND() для копирования

данных из v_src_clob в конец v_dest_clob:

□ CREATE PROCEDURE append_example AS

v_src_clob CLOB;

v_dest_clob CLOB;

BEGIN

524 Глава 14

— получим локатор L0B для CL0B в строке #2

— таблицы clo b _con te n t в v _ s rc_ c lo b

g e t_ c lo b _ lo c a to r(v _ s rc _ c lo b , 2);

- - получим локатор L0B для CL0B в строке #1

- - таблицы clo b _ co n te n t в v_ d e st_ clo b для обновления

— (для обновления, потому что позже в CL0B будут добавлены данные

— при помощи APPENDO )

SELECT c lo b _ c o lum n

INTO v_de st_clob

FROM clob _content

WHERE id = 1

FOR UPDATE;

- - прочитаем и отобразим содержимое CLOB #1

read_clob_example(1);

— используем APPENDO для копирования содержимого v _ s rc_ c lo b в v_

d e st_ clo b

DBMS_L0B.APPEND(v _ d e s t_ c lo b , v _ s r c _ c lo b ) ;

— прочитаем и отобразим содержимое CLOB #1

— и затем откатим изменение

read_clob_example(1);

ROLLBACK;

END append_example;

/

Следующий пример вызывает append_example():

П CALL append_example();

v_ch a r_ b u ffe r = Creeps in t h is p e tty pace

v_amount = 25

v _ ch a r_ b u ffe r = Creeps in t h is p e tty pace from day to day

v_amount = 41

Сравнение данных в двух C LO B

Следующая процедура compare_example() сравнивает данные в v_clob1 и v_

c lob 2 при помощи C0MPARE():

□ CREATE PROCEDURE compare_example AS

v_clob1 CLOB;

v_clob2 CLOB;

v_ re tu rn INTEGER;

BEGIN

— получим локаторы LOB

g e t_ c lo b _ lo c a to r(v _ c lo b 1 , 1);

g e t_ c lo b _ lo c a to r(v _ c lo b 2 , 2);

- - сравним v _ c lo b 1 с v _ c lo b 2 (COMPAREO возвращает 1,

— потому что содержимое v _ c lo b 1 и v _ c lo b 2 р а зл и ч а е т с я )

DBMS_OUTPUT.PUT_LINE(' Comparing v_clob1 w ith v _ c lo b 2 ');

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

v_return := DBMS_LOB.C0MPARE(v_clob1, v_clob2);

DBMS_OUTPUT.PUT_LINE('v_return = ' || v_return);

— сравним v_clob1 с v_clob1 (COMPAREO возвращает 0,

-- потому что содержимое v_clob1 и v_clob1 одинаковое)

DBMS_0UTPUT.PUT_LINE('Comparing v_clob1 with v_clob1');

v_return := DBMS_L0B.C0MPARE(v_clob1, v_clob1);

DBMS_0UTPUT.PUT_LINE(' v_return = ’ || v_return);

END compare_example;

/

Следующий пример вызывает compare_example():

□ CALL compare_example();

Comparing v_clob1 with v_clob2

v_return = 1

Comparing v_clob1 with v_clob1

v_return = 0

Обратите внимание, что v_return равно 1 при сравнении v_clob1 с v_

clob2. Это означает, что данные L0B различаются, vjreturn равно 0 при

сравнении v clobl с v_clob1. Это означает, что данные L0B одинаково.

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

Следующая процедура copy_example() копирует некоторые символы из v_

src_clob в v_dest_clob при помощи COPY():

□ CREATE PROCEDURE copy_example AS

v_src_clob CLOB;

v_dest_clob CLOB;

v_src_offset INTEGER := 1;

v_dest_offset INTEGER := 7;

v_amount INTEGER := 5;

BEGIN

-- получим локатор LOB для CLOB в строке #2

-- таблицы clob_content в v_dest_clob

get_clob_locator(v_src_clob, 2);

-- получим локатор LOB для CLOB в строке #1

— таблицы clob_content в v_dest_clob для обновления

— (для обновления, потому что позже в CL0B будут добавлены данные

-- при помощи C0PY() )

SELECT clob_column

INTO v_dest_clob

FROM clob_content

WHERE id = 1

FOR UPDATE;

-- прочитаем и отобразим содержимое CLOB #1

read_clob_example(1);

-- скопируем символы в v_dest_clob из v_src_clob при помощи C0PY(),

— начиная со смещений, указанных при помощи v_dest_offset и