Модификация подстрок 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.