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

Функция

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

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

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

  3. < Позиция > задает позицию в байтах заменяемой подстроки в < столбце >. Отсчет начинается с 1. Если BLOB-столбец имеет кодовую страницу UNICODE, то < позиция > не может быть чётной, в противном случае выдаётся код завершения 1036 («Значение аргумента в недопустимом диапазоне»).

  4. < Длина > задает длину заменяемой подстроки в < столбце > в байтах. Если BLOB-столбец имеет кодовую страницу UNICODE, то < позиция > не может быть нечётной, в противном случае выдаётся код завершения 1036 («Значение аргумента в недопустимом диапазоне»).

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

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

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

    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=insert(bl, ? (int), ? (int), ? (char(2)));
    3
    2
    aa
    
    select lenblob(bl), getblobstr(bl, 1, 60) from test;
    |         50|01aa456789 aaa 0123456789|
Общие правила
  1. Начиная с < позиции >, в BLOB-столбце удаляется < длина > байт, и на их место вставляются символы или байты < подстроки >.

  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=insert(bl, 3, 2, 'aa');
select lenblob(bl), getblobstr(bl, 1, 60) from test;
|         50|01aa456789 aaa 0123456789|

update test set bl=insert(bl, 5, 3, HEX('310031003100'));
select lenblob(bl), getblobstr(bl, 1, 60) from test;
|         50|01aa111789 aaa 0123456789|

Примечание

В конструкции «bl=insert(bl, 3, 10, 'aa')» часть «bl=» является вспомогательной, то есть реального присвоения не происходит, а собственно модификация BLOB-данных осуществляется внутри функции INSERT.