Вы можете использовать что-то похожее на эту рекурсивную функцию:
create or replace function alpha_id(i_id in varchar2) return varchar2 is
begin
if trim(translate(i_id, 'Z', ' ')) is null then
return rpad('A', nvl(length(i_id), 0) + 1, 'A');
end if;
if substr(i_id, length(i_id), 1) = 'Z' then
return alpha_id(substr(i_id, 1, length(i_id) - 1))||'A';
else
return substr(i_id, 1, length(i_id) - 1)
|| chr(ascii(substr(i_id, length(i_id), 1)) + 1);
end if;
end alpha_id;
Здесь особо отмечаются только манипуляции со строками и рекурсивный вызов, если последний символ равен Z
.Тест:
with t(rn, id) as (
select 1, 'A' from dual union all
select 2, 'N' from dual union all
select 3, 'Z' from dual union all
select 4, 'AA' from dual union all
select 5, 'BP' from dual union all
select 6, 'QZ' from dual union all
select 7, 'ZZ' from dual union all
select 8, 'BPZ' from dual union all
select 9, 'ZZZ' from dual )
select rn, id, alpha_id(id) next_id from t;
Результат:
RN ID NEXT_ID
----- --- ---------
1 A B
2 N O
3 Z AA
4 AA AB
5 BP BQ
6 QZ RA
7 ZZ AAA
8 BPZ BQA
9 ZZZ AAAA