Сначала необходимо разбить строку на две части, затем преобразовать обе части в числа и применить MAX
и увеличить на 1.
Это пример запроса
with tbl as (
select
SEQUENCE_NUMBER,
to_number(substr(SEQUENCE_NUMBER,1,instr(SEQUENCE_NUMBER,'.')-1)) num1,
to_number(substr(SEQUENCE_NUMBER,instr(SEQUENCE_NUMBER,'.')+1)) num2
from TESTING_TBL)
select SEQUENCE_NUMBER, NUM1, NUM2
from tbl
order by num1, num2;
давая данные как
SEQUENCE_NUMBER NUM1 NUM2
------------------------------ ---------- ----------
0.0 0 0
0.1 0 1
....
0.8 0 8
0.9 0 9
0.10 0 10
Теперь с помощью цифр вы можете безопасно найти МАКС и добавить 1
with tbl as (
select
SEQUENCE_NUMBER,
to_number(substr(SEQUENCE_NUMBER,1,instr(SEQUENCE_NUMBER,'.')-1)) num1,
to_number(substr(SEQUENCE_NUMBER,instr(SEQUENCE_NUMBER,'.')+1)) num2
from TESTING_TBL)
select to_char(max(NUM1))||'.'||to_char(max(NUM2)+1) new_key
from tbl
, что дает ожидаемый результат
NEW_KEY
---------------------------------------------------------------------------------
0.11
Обратите внимание, что вы следует пересмотреть свой дизайн, если это оптимальный подход. В качестве лучшего и более безопасного варианта я бы рассмотрел хранение двух столбцов INT (введите safe!) И определение представления текста только как виртуальный столбец:
CREATE TABLE TESTING_TBL2 (num1 int, num2 int);
alter table TESTING_TBL2 add SEQUENCE_NUMBER AS (to_char(num1)||'.'||to_char(num2)) VIRTUAL ;
добавить тестовые данные
INSERT ALL INTO TESTING_TBL2 ( num1, num2 ) VALUES ( 0,0 )
-- ....
INTO TESTING_TBL2 (num1, num2) VALUES ( 0,9 )
INTO TESTING_TBL2 (num1, num2) VALUES ( 0,10)
SELECT '1' FROM dual;
теперь этот простой запрос предоставляет новые ключи
select max(num1) num1, max(num2)+1 num2 from TESTING_TBL2;
Полные данные
select * from TESTING_TBL2;
NUM1 NUM2 SEQUENCE_NUMBER
---------- ---------- -------------------
0 0 0.0
0 9 0.9
0 10 0.10
Помните также, что алгоритм MAX + 1
для распределения новых ключей лучше всего работает в одиночном пользователь enviromnemt.