sql >> Base de Datos >  >> RDS >> Oracle

Creando una secuencia de Oracle que comienza con alfanumérico

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 INV00000001and 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).