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

которые необходимо записать в BLOB;

■ offse t является смещением, начиная с которого нужно записывать

данные в L0B (смещение начинается с 1);

■ buffer является переменной, которая содержит данные для записи в

L0B.

В следующей таблице перечислены исключения, создаваемые WRITE().

Исключение Создаётся в случае

VALUE_ERROR Любой из входных параметров равен NULL или неправильный.

INVALID_ARGVAL Любое из условий:

■ amount < 1

■ amount > MAXBUFSIZE

■ offset < 1

■ offset > LOBMAXSIZE

WRITEAPPENDO

Метод WRITEAPPEND() записывает данные из буфера в конец L0B, начиная со

смещения и в указанном количестве символов или байтов. Есть две версии

WRITEAPPENDO:

П DBMS_LOB.WRITEAPPEND(

lob IN OUT NOCOPY BLOB,

amount IN BINARY_INTEGER,

buffer IN RAW

);

Глава 14

DBMS_LOB.WRITEAPPEND (

lob IN OUT NOCOPY CLOB/NCLOB CHARACTER SET ANY_CS,

amount IN BINARY_INTEGER,

buffer IN VARCHAR2 CHARACTER SET lob%CHARSET

);

где

■ lob - BLOB, CLOB или NCLOB, в который нужно записать данные;

■ amount является максимальным числом символов, которые нужно

записать в CLOB/NCLOB, или максимальным числом байтов, которые

нужно записать в BLOB;

■ buffer является переменной, которая содержит данные для записи в

L0B.

В следующей таблице перечислены исключения, создаваемые

WRITEAPPENDQ.___________________________ ________________________________________

Исключение_______ Создаётся в случае____________ ___________________________

VALUE_ERROR Любой из входных параметров равен NULL или неправильный.

INVALID_ARGVAL Любое из условий:

■ amount < 1

ш amount > MAXBUFSIZE__________________________________

Примеры процедур PL/SQL

В этом разделе вы увидите примеры процедур PL/SQL, которые используют

различные методы, описанные в предыдущих разделах. Процедуры

примеров создаются при запуске сценария lob_schema.sql.

Получение локатора LOB

Следующая процедура get_clob_locator() получает локатор L0B из таблицы

clob_content; get_clob_locator() выполняет следующие задачи.

■ Принимает параметр IN OUT по имени p_clob типа CLOB; p_clob устанавливается

на локатор L0B внутри процедуры. Поскольку p_clob объявлена

как IN OUT, то значение передаётся на выходе из процедуры.

■ Принимает параметр IN по имени p_id типа INTEGER, который указывает

идентификатор строки, которую нужно получить из таблицы

clob_content.

■ Выбирает clob_column из таблицы clob_content в p_clob; это позволяет

сохранить локатор L0B для clob_column в p_clob.

□ CREATE PROCEDURE get_clob_locator(

p_clob IN OUT CLOB,

p_id IN INTEGER

) AS

BEGIN

— получим локатор LOB и сохраним его в p_clob

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

SELECT clob_column

INTO p_clob

FROM clob_content

WHERE id = p_id;

END get_clob_locator;

/

Следующая процедура get_blob_locator() выполняет то же самое действие,

что и предыдущая процедура, только она получает локатор для BLOB

из таблицы blob_content:

П CREATE PROCEDURE get_blob_locator(

p_blob IN OUT BLOB,

p_id IN INTEGER

) AS

BEGIN

-- получим локатор LOB и сохраним его в p_blob

SELECT blob_column

INTO p_blob

FROM blob_content

WHERE id = p_id; - '

END get_blob_locator;

/

Эти две процедуры используются в коде, который показан в следующих

разделах.

Чтение данных из C LO B и B LO B

Следующая процедура read_clob_example() читает данные из CL0B и отображает

их на экране; read_clob_example() выполняет следующие действия:

■ вызывает get_clob_locator() чтобы получить локатор и сохраняет

его в v_clob;

■ использует READO для чтения содержимого v_clob в переменную

VARCHAR2 по имени v_char_buffer.

■ Отображает содержимое v_char_buffer на экране

□ CREATE PROCEDURE read_clob_example(

p_id IN INTEGER

) AS

v_clob CLOB;

v_offset INTEGER := 1;

v_amount INTEGER := 50;

v_char_buffer VARCHAR2(50);

BEGIN

— получим локатор LOB и сохраним его в v_clob

get_clob_locator(v_clob, p_id);

-- прочитаем содержимое v_clob в v_char_buffer, начиная с

— позиции position и в количестве v_amount символов

DBMS_L0B.READ(v_clob, v_amount, v_offset, v_char_buffer);

522 Глава 14

— отобразим содержимое v_ch a r_b u ffe r

DBMS_OUTPUT.PUT_LINE(' v_char_buffег = ' || v_char_buffer);

DBMS_OUTPUT.PUT_LINE(' v_amount = ' II v_amount);

END read_clob_example;

/

Следующий пример включает вывод на сервере и вызывает read_clob_

example():

□ SET SERVEROUTPUT ON

CALL read_clob_example(1);

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

v_amount = 25

Следующая процедура read_blob_example() читает данные из BLOB, read_

blob_example() выполняет следующие действия:

■ вызывает g e t_ b lo b _ lo c a to r( ), чтобы получить локатор, и сохраняет

его в v_blob;

■ вызывает READ( ),_для чтения содержимого v_blob в переменную RAW

по имени v_binary_bu f fer;

■ отображает содержимое v_binary_buf fer на экране.

□ CREATE PROCEDURE read_blob_example(

p_id IN INTEGER

) AS

v_blob BLOB;

v _ o ffs e t INTEGER := 1;

v_amount INTEGER := 25;

v _ b in a ry _ b u ffe r RAW(25);

BEGIN

— получим локатор LOB и сохраним его в v_blob