Solo se pueden crear secuencias con valores enteros.
Entonces la declaración debe ser:
CREATE SEQUENCE invoice_nun
START WITH 1
INCREMENT BY 1;
Puede convertir el valor obtenido en una cadena y agregar un prefijo adecuado.
select 'INV'||to_char(invoice_nun.nextval,'FM09999999')
from dual;
Puede crear una función para simular una secuencia que devuelva valores de cadena apropiados
create or replace function next_invoice_nun return varchar2
as
begin
return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
end;
/
ahora puedes hacer
select next_invoice_nun
from dual;
La secuencia definida anteriormente utiliza algunos valores predeterminados. Esto está documentado en la Referencia del lenguaje SQL de la base de datos . Es equivalente a la siguiente declaración
CREATE SEQUENCE invoice_nun
CACHE 20
NOORDER
START WITH 1
INCREMENT BY 1;
Debe tener en cuenta lo siguiente:
1) Si una transacción obtiene un valor de secuencia y retrocede, el valor de secuencia se pierde. Así que si haces lo siguiente:
-- fetch invoice_id INV00000001
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
commit;
-- fetch invoice_id INV00000002
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
rollback;
-- fetch invoice_id INV00000003
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
commit;
los identificadores de factura INV00000001
and
INV00000003are inserted in the
facturastable but the invoice id
INV00000002` se pierde porque la declaración que lo obtuvo se revirtió
2) Si una instancia falla, todas las secuencias que están en el caché de la instancia se pierden. En su ejemplo, se usa el valor predeterminado para el caché, que es 20. Por lo tanto, si las instancias fallan, se pueden perder como máximo 20 valores de secuencia. una alternativa es usar la palabra clave NOCYCLE
si crea la secuencia, pero esto traerá penalizaciones de rendimiento.
3) Si está en un sistema RAC, el número de secuencia no representa el orden de obtención de la declaración. Entonces, es posible que la primera declaración obtenga la identificación INV00000021
y la segunda declaración obtiene el id INV00000001
si la segunda declaración se ejecuta en una instancia diferente a la primera declaración. Esto se debe a que la instancia obtuvo los primeros 20 números de secuencias en su caché y la otra instancia obtuvo los segundos 20 números de secuencias en su caché. La primera declaración se ejecuta en la instancia que obtuvo los segundos 20 números de secuencia. Puedes usar el ORDER
palabra clave para evitar esto, pero esto nuevamente traerá penalizaciones de rendimiento
Por lo tanto, uno puede evitar 2) y 3) por el precio de las penalizaciones de rendimiento, pero no hay forma de evitar 2).