-- v_src_offset для общего числа символов v_amount
526 Глава 14
DBMS_LOB.COPY(
v _ d e s t_ c lo b , v _ s r c _ c lo b ,
v_amount, v _ d e s t _ o f f s e t , v _ s r c _ o f f s e t
);
-- прочитаем и отобразим содержимое CLOB #1
— и откатим изменение
read_clob_example(1);
ROLLBACK;
END copy_example;
/
Следующий пример вызывает copy_example():
□ CALL copy_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 fromhis p e tty pace
v_amount = 25
Использование временных C LO B
Следующая процедура'1етрогагу_1оЬ_ехашр1е() иллюстрирует использование
временного CL0B:
□ CREATE PROCEDURE temporary_lob_example AS
v_clob CLOB;
v_amount INTEGER;
v_offset INTEGER := 1;
v _ ch a r_ b u ffe r VARCHAR2(17) := ‘ J u lie t i s the sun’ ;
BEGIN
— используем CREATETEMPORARY() для создание временного CLOB по имени
v _ c lo b
DBMS_L0B.CREATETEMPORARY(v_clob, TRUE);
— используем WRITEO для записи содержимого v _ c h a r_ b u f fe r в v _ c lo b
v_amount := LENGTH(v_cha r_buf fer ) ;
DBMS_L0B.WRITE(v _ c lo b , v_amount, v _ o f f s e t , v _ c h a r _ b u f f e r ) ;
— используем ISTEMPORARY() для проверки, является ли v_clob временным
IF (DBMS_L0B.ISTEMPORARY(v_clob) = 1) THEN
DBMS_OUTPUT.PUT_LINE(' v_clob i s tem p orary');
END IF;
— используем READ() для чтения содержимого v_clob в v_char_b uffer
DBMS_L0B.READ(
v_ c lo b , v_amount, v _ o f f s e t , v _ c h a r_ b u f fe r
DBMS_OUTPUT.PUT_LINE('v_char_buffer = ' || v _ c h a r _ b u f f e r ) ;
— используем FREETEMPORARYO для освобождения v_clob
DBMS_L0B.FREETEMPORARY(v_clob);
END temporary_lob_example;
/
Большие объекты 527
Следующий пример вызывает temporary_lob_example():
□ CALL temporary_lob_example();
v_clob is temporary
v_char_buffer = Juliet is the sun
Удаление данных из C LO B
Следующая процедура erase_example() удаляет часть CLOB при помощи
ERASEO:
П CREATE PROCEDURE erase_exarnple IS
v_clob CLOB;
v_offset INTEGER := 2;
v_amount INTEGER := 5;
BEGIN
-- получим локатор LOB для CLOB в строке#1
— таблицы clob_content в v_dest_clob для обновления
-- (для обновления, поскольку часть CL0B будет далее удалена
-- при помощи ERASEO \
SELECT clob_column
INTO v_clob
FROM clob_content
WHERE id = 1
FOR UPDATE;
— прочитаем и отобразим содержимое CLOB #1
read_clob_example(1);
— используем ERASEO для удаления в общей сложности v_amount символов
-- из v_clob, начиная с v_offset
DBMS_L0B.ERASE(v_clob, v_amount, v_o ffs et);
-- прочитаем и отобразим содержимое CLOB #1
-- и затем откатим изменение
read_clob_example(1);
ROLLBACK;
END erase_example;
/
Следующий пример вызывает erase_example():
□ CALL erase_example();
v_char_buffer = Creeps in this petty pace
v_amount = 25
v_char_buffer = С in this petty pace
v_amount = 25
Поиск данных в C LO B
Следующая процедура instr_example() использует INSTR() для поиска символьных
данных, хранимых в CL0B;
□ CREATE PROCEDURE instr_example AS
v_clob CLOB;
528 Глава 14
v_ ch a r_ b u ffe r VARCHAR2(50) := ‘ I t i s the east and J u lie t i s the sun’ ;
v_ p a tte rn VARCHAR2(5);
v _ o ffs e t INTEGER ;= 1;
v_amount INTEGER;
v_occurrence INTEGER;
v_ re tu rn INTEGER;
BEGIN
— используем CREATETEMPORARY() для создания временного CLOB no имени
v_clob
DBMS_L0B.CREATETEMPORARY(v _ c lo b , TRUE);
- - используем WRITE() для записи содержимого v_char_b uffer в v_clob
v_amount := LENGTH(v_char_buffer);
DBMS_L0B.WRITE(v_clob, v_amount, v _ o ffs e t, v_char_buffer);
— используем READ() для чтения содержимого v_clob в v_char_buffer
DBMS_L0B.READ(v_clob, v_amount, v _ o ffse t, v_char_buffer);
DBMS_OUTPUT.PUT_LINE(' v_char_b uffer = ' || v _ ch a r_ b u ffe r);
— используем INSTRQ для поиска в v_clob второго вхождения слова is ,
- - и INSTRQ возвращает 27
DBMS_OUTPUT. PUT_LINE( 'Searching fo r second " i s " ' ) ;
v_pattern := ' i s ' ;
v_occurrence ;= 2;
v_return := DBMS_L0B.INSTR(v_clob, v_pattern, v _ o ffse t, v_ o ccurren ce );
DBMS_OUTPUT.PUT_LINE(’ v_retu rn = ' || v_return);
— используем INSTRQ для поиска в v_clob первого вхождения слова Moon,
- - и INSTRQ возвращает 0, потому что слово Мооп отсутствует в v_clob
DBMS_OUTPUT. PUT_LINE(' Searching fo r "M o o n " ’ );
v_pattern := 'Moon';
v_occurrence := 1;
v_return := DBMS_L0B.INSTR(v_clob, v_pattern, v _ o ffse t, v_occurrence);
DBMS_OUTPUT.PUT_LINE(’ v_return = ' || v_return);
— используем FREETEMPORARYQ для освобождения v_clob
DBMS_L0B.FREETEMPORARY(v_clob);
END instr_example;
/
Следующий пример вызывает in s tr_ e x am p le ():
□ CALL in s tr_ e x am p le ();
v _ ch a r_ b u ffe r = I t i s the east and J u lie t i s the sun
Searching fo r second ‘ i s ’
v _ re tu rn = 27
Searching fo r ‘ Moon’
v_ re tu rn = 0
Копирование данных из файла в C LO B и B LO B
Следующая процедура copy_file_data_to_clobQ показывает, как читать
текст из файла и сохранять его в CL0B;
Большие объекты 529
□ CREATE PROCEDURE co p y _ file _ d a ta _ to _ c lo b (
p _ c lob_ id INTEGER,
p _ d ire c to ry VARCHAR2,
p_file_name VARCHAR2
) AS
v _ f ile UTL_FILE.FILEJTYPE;
v_chars_read INTEGER;
v_de st_clo b CLOB;
v_amount INTEGER : = 32767;
v _ ch a r_ b u ffe r VARCHAR2(32767);
BEGIN
- добавим пустой CLOB
INSERT INTO clo b _ co n te n t(
id , clob_column
) VALUES (
p_ clo b_ id , EMPTY_CLOB()
);
- получим локатор LOB для CLOB
SELECT clob_column
INTO v_de st_clob
FROM clob _content
WHERE id = p_clob_id
FOR UPDATE;
- откроем файл для чтения текста (до v_amount символов в каждой строке)