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

-- 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 символов в каждой строке)