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

Функция

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