Los huecos aparecen si una transacción utiliza un número de secuencia pero luego se revierte.
Quizás la respuesta no sea asignar el número de factura hasta que la factura no se pueda deshacer. Esto minimiza (pero probablemente no elimina) las posibilidades de brechas.
No estoy seguro de que haya una forma rápida o fácil de garantizar la ausencia de huecos en la secuencia: escanear para MAX, agregar uno e insertarlo probablemente sea lo más cercano a seguro, pero no se recomienda por motivos de rendimiento (y dificultades con la concurrencia) y la técnica no detectará si se asigna el último número de factura, luego se elimina y se reasigna.
¿Puede explicar las lagunas de alguna manera, identificando qué números de factura fueron 'usados' pero 'no hechos permanentes' de alguna manera? ¿Podría una transacción autónoma ayudar a hacer eso?
Otra posibilidad - suponiendo que las lagunas son relativamente pocas y distantes.
Cree una tabla que registre los números de secuencia que se deben reutilizar antes de que se capture un nuevo valor de secuencia. Normalmente, estaría vacío, pero algún proceso que se ejecuta cada ... minuto, hora, día ... busca huecos e inserta los valores perdidos en esta tabla. Todos los procesos primero verifican la tabla de valores perdidos, y si hay algún presente, use un valor desde allí, pasando por el lento proceso de actualización de la tabla y eliminando la fila que usan. Si la tabla está vacía, toma el siguiente número de secuencia.
No es muy agradable, pero el desacoplamiento de 'emitir números de factura' de 'escanear valores perdidos' significa que incluso si el proceso de facturación falla para un subproceso cuando está utilizando uno de los valores perdidos, ese valor será redescubierto para perder y volver a publicar la próxima vez, repetir hasta que algún proceso tenga éxito.
¿Has probado la opción 'NOCACHE' en' CREATE SEQUENCE'? Eso debería eliminar las lagunas. – skaffman
@skaffman: No, 'NOCACHE' especifica cuántos valores de secuencia se almacenarán en la memoria para un acceso más rápido: http://www.techonthenet.com/oracle/sequences.php –