которые необходимо записать в 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