Корректировка подстроки (INSERT/OVERLAY)
Функция
Корректировка подстроки в заданной строке (удаление подстроки или ее замена).
Спецификация
Варианты:
::=::=Общие правила
-
<Символьное выражение>в аргументе может иметь следующие типы данных:CHAR,VARCHAR,NCHAR,NCHAR VARYING, символьное BLOB-значение. -
Типы данных
<строки>и<подстроки>должны быть приводимыми. -
<Числовое выражение>должно быть целочисленным значением или приводиться к нему. -
Длина
<подстроки>не должна быть более 4000. -
<Позиция>задает позицию в символах заменяемой подстроки в<строке>. Отсчет начинается с единицы. -
<Длина>задает количество заменяемых в<строке>символов. -
<Подстрока>задает заменяющее в<строке>значение. -
Все аргументы функции могут быть заданы
<SQL-параметром>, который должен содержать спецификацию типа данных параметра.select insert (? (char(20)),? (int), ?(int), ? (char(5))); 123 456 789 5 3 abcde |123 abcde 789 | select OVERLAY ('123 456 789' PLACING 'abcde' FROM 5 FOR 7); |123 abcde | -
Начиная с
<позиции>, удаляется<длина>символов, и на место удаленных вставляются символы <подстроки>.select insert('12345',2,3, 'abcd'); | 1abcd5 | select overlay('12345' placing 'abcd' from 2 for 3); |1abcd5 | -
В функции insert позиция вставки
<подстроки>не должна превышать правую границу<строки>.select insert('12345',5,0, 'abcd'); | 1234abcd5 |select insert('12345',5,1, 'abcd'); | 1234abcd |Удаление подстроки:
select insert('12345',1,3, ''); | 45 | -
В функции overlay позиция вставки
<подстроки>может быть за правой границей<строки>. В этом случае добавляемая<подстрока>просто присоединяется к<строке>.select overlay('12345' placing 'abcd' from 20); |12345abcd| -
В обеих функциях количество заменяемых символов, начиная от заданной
<позиции>, может выходить за правую границу<строки>. В этом случае в<строке>удаляются все символы, начиная с<позиции>и до конца<строки>.select insert('12345',5,3, 'abcd'); |1234abcd | select overlay('12345' placing 'abcd' from 3 for 30); |12abcd | -
Если аргумент FOR
<длина>не задан (или задано отрицательное значение), в качестве<длины>используется длина<подстроки>.select overlay('12345' placing 'abcd' from 2); |1abcd | select overlay('12345' placing 'abcd' from 2 for -10); |1abcd | -
Количество заменяемых символов может превышать количество удаляемых, т.е.:
select insert('12345',5,1, model) from auto; |1234MERCURY COMET GT V8 | |1234A-310 | …select insert(model, length(model), 1, 'Год выпуска: ') || to_char(year + 1900, '9999') from auto;
-
Длина
<подстроки>в байтах должна быть в точности равна количеству байтов, соответствующим символам<длины>.Например, если заменяется часть строки из двух русских символов в кодировке UTF-8 (каждый занимает 2 байта), то её можно заменить либо на два других двухбайтовых символа, либо на 1 двухбайтовый символ и 2 однобайтных, либо на 4 однобайтных символа. Пример (для утилиты inl): create or replace table blb(bl blob character set "UTF-8"); insert into blb values (n'АБВГ'); select lenblob(bl,1), getblobstr(bl,1,4,1) from blb; | 4|АБВГ | update blb set bl = insert(bl,2,2,'1234'); select lenblob(bl,1), getblobstr(bl,1,6,1) from blb; | 6|А1234Г |
-
Длина возвращаемого значения определяется как сумма длин
<строки>и<подстроки>(ограничивается максимальным размером 4000 байт). -
Если хотя бы один из входных аргументов у функций равен NULL-значению, возвращается NULL-значение.
Возвращаемое значение
-
<Строка>со вставленной<подстрокой>. -
Код завершения при неправильном значении аргумента функции.