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 и