WITH t AS ( SELECT '' seq FROM dual UNION ALL SELECT 'ZZZZZZZZZZ' FROM dual UNION ALL SELECT 'ZZZZZZZZZM' FROM dual --UNION ALL SELECT 'ZZZZZZZZZA' FROM dual --UNION ALL SELECT 'ZZZZZZZZYZ' FROM dual --UNION ALL SELECT 'ZZZZZZZZYA' FROM dual --UNION ALL SELECT 'ZZZZZZZAAA' FROM dual --UNION ALL SELECT 'AAAAAAAAAA' FROM dual ) SELECT seq current_seq , CASE WHEN seq IS NULL THEN 'ZZZZZZZZZZ' WHEN v = 10 THEN 'Sequnce Overflow Error' ELSE SUBSTR(seq, 1, 10 - v - 1) || CHR(ASCII(SUBSTR(seq, 10 - v, 1)) - 1) || LPAD('Z', v, 'Z') END next_seq FROM (SELECT MIN(seq) seq , NVL(LENGTH(REGEXP_SUBSTR(MIN(seq), 'A+$')), 0) v FROM t ) ;