substr(v_cur_nbr, 1,7)||to_number(substr(v_cur_nbr, 8,1))+1
Это швыряет ORA-01722: invalid number
. Причина тонкая. Кажется, Oracle применяет оператор конкатенации перед добавлением, так что вы фактически добавляете его в строку '1.2b.3.4'
.
Одним из решений является использование функции TO_CHAR для заключения в скобки сложения со второй подстрокой перед объединением результата с первой подстрокой:
substr(v_cur_nbr, 1,7) || to_char(to_number(substr(v_cur_nbr, 8,1))+1)
Рабочая демонстрация на db <> fiddle .
Кстати, подобный ключ - плохая часть моделирования данных. Умные клавиши тупые. Они всегда приводят к ужасным SQL (как вы обнаружили) и риску повреждения данных. Правильная модель будет иметь отдельных столбцов для каждого элемента номера версии. Мы можем использовать виртуальные столбцы для объединения номера версии для отображения обстоятельств.
create table cats(
seqid number
,name varchar2(32)
,major_ver_no1 number
,major_ver_no2 number
,variant varchar2(1)
,minor_ver_no1 number
,minor_ver_no2 number
,v_cur_nbr varchar2(16) generated always as (to_char(major_ver_no1,'FM9') ||'.'||
to_char(major_ver_no2,'FM9') ||'.'||
variant ||'.'||
to_char(minor_ver_no1,'FM9') ||'.'||
to_char(minor_ver_no2,'FM9') ) );
Таким образом, установка - это немного тошнота, но увеличение номера версии - это просто пирог.
update cats
set major_ver_no1 = major_ver_no1 +1
, major_ver_no2 = 0
, variant = 'a';
Есть db <> скрипка за это тоже.