Модификация подстрок BLOB-данных

Функция

Модификация всех заданных подстрок BLOB-данных с помощью SQL-запросов UPDATE и UPDATE CURRENT.

Спецификация
<модификация подстрок порции BLOB-данных>::=
<спецификация модифицируемых подстрок>::=
Синтаксические правила
  1. <Подстрока1>, <подстрока2> должны иметь типы данных: CHAR, VARCHAR, NCHAR, NCHAR VARYING, BYTE, VARBYTE.

  2. Длина <подстроки1>, <подстроки2> не должна быть более 4000.

  3. <Подстрока1> задает удаляемое из <столбца> значение.

  4. <Подстрока2> задает вставляемое вместо удаленной <подстроки1> значение.

  5. Если <подстрока1> и <подстрока2> имеют символьный тип данных (CHAR, VARCHAR, NCHAR, NCHAR VARYING), они автоматически перекодируются в кодовую страницу, заданную для BLOB-столбца. Если <подстрока1> и <подстрока2> имеют байтовый тип данных, они будут использоваться «как есть».

  6. Аргументы <подстрока1> и <подстрока2> могут быть заданы <SQL-параметром>, который должен содержать спецификацию типа данных параметра.

    create or replace table test(bl blob);
    insert into test(bl) values('Мы едем, едем, едем в далекие края.');
    select lenblob(bl), getblobstr(bl, 1, 35) from test;
    |         35|Мы едем, едем, едем в далекие края.|
    update test set bl=replace(bl, :line1 (char(4)), :line2 (char(4)));
    едем
    ЕДЕМ
    select lenblob(bl), getblobstr(bl, 1, 35) from test;
    |         35|Мы ЕДЕМ, ЕДЕМ, ЕДЕМ в далекие края.|
Общие правила
  1. В текущей строке BLOB-столбца удаляются символы или байты всех <подстрок1>, и вместо них вставляются символы или байты <подстроки2>.

  2. Если будет предпринята попытка заменить часть BLOB-данных на порцию, <длина> которой в байтах отличается от заменяемой части, то будет выдан код завершения 1721 («Неверное смещение в странице BLOB»).

Возвращаемое значение

Отсутствует. Если значения аргументов функции правильные, выполняется корректировка BLOB-данных, в противном случае BLOB-данные не изменяются.

Пример
create or replace table test(bl blob character set "UCS2");
insert into test(bl) values('0123456789 aaa 0123456789');
select lenblob(bl), getblobstr(bl, 1, 60) from test;
|         50|0123456789 aaa 0123456789|
update test set bl=replace(bl, '123456', 'замена');
select lenblob(bl), getblobstr(bl, 1, 60) from test;
|         50|0замена789 aaa 0замена789|
update test set bl=replace(bl, HEX('37003800'), HEX('78007800'));
select lenblob(bl), getblobstr(bl, 1, 60) from test;
|         50|0заменаxx9 aaa 0заменаxx9|

Примечание

В конструкции «set bl=replace(bl, '123456', 'замена')» часть «bl=» является вспомогательной, т.е. реального присвоения не происходит, а собственно модификация BLOB-значения осуществляется внутри функции REPLACE.