Модификация подстрок BLOB-данных (SET/REPLACE)

Функция

Модификация всех заданных подстрок 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.