Quiero crear una secuencia para iniciar con carácter inv y se incrementan en 1

Los valores a ser

INV01
INV02
INV03  
etc...
CREATE SEQUENCE invoice_nun
START WITH "INV"
INCREMENT BY 1

OriginalEl autor Francis John | 2014-11-15

2 Comentarios

  1. 8

    Sólo valores enteros secuencias pueden ser creados.

    Por lo que la instrucción debe ser:

    CREATE SEQUENCE invoice_nun
      START WITH 1
      INCREMENT BY 1;

    Usted puede convertir el exagerado valor a 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 de devolver los valores de cadena adecuados

    create or replace function next_invoice_nun return varchar2
      as
      begin
      return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
      end;
    / 

    ahora se puede hacer

    select next_invoice_nun 
      from dual;

    La secuencia como se definió anteriormente, utiliza algunos valores por defecto. Esto está documentado en el Base de datos de SQL Lenguaje de Referencia. Es equivalente a la siguiente instrucción

    CREATE SEQUENCE invoice_nun
      CACHE 20
      NOORDER
      START WITH 1
      INCREMENT BY 1;

    Usted debe ser consciente de los siguientes:

    1) Si una transacción se obtiene un valor de secuencia y los rollos de la espalda, a continuación, la secuencia de valor se pierde. Así que si usted se haga las siguientes:

    -- 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;

    la factura idINV00000001andINV00000003are inserted in thefacturastable but the invoice idINV00000002` se pierde debido a que la instrucción que se obtienen se revierte

    2) Si una instancia se bloquea todas las secuencias que están en la memoria caché de la instancia se pierden. En su ejemplo, el valor predeterminado para la memoria caché se utiliza, que es de 20. Así que si las instancias de los accidentes en la mayoría de los 20 valores de la secuencia puede ser perderse. una alter nativa es el uso de la palabra clave NOCYCLEsi usted crear la secuencia, pero esto traerá penalizaciones de rendimiento.

    3) Si usted está en un sistema RAC número de secuencia no representa el fin de la obtención de la declaración. Así que es posible que la primera instrucción obtiene el identificador INV00000021 y la segunda declaración se obtiene el identificador INV00000001 si la segunda instrucción se ejecuta en una instancia diferente de la primera instrucción. Esto es debido a que la instancia obtenido los primeros 20 secuencias de números en su caché y la otra instancia recuperan el segundo 20 secuencias de números en su caché. La primera instrucción que se ejecuta en la instancia que obtiene el segundo 20 números de secuencia. Usted puede utilizar el ORDER palabra clave para evitar esto, pero de nuevo, esto va a traer penalizaciones de rendimiento

    Así que uno puede evitar 2) y 3) por el precio de penalizaciones de rendimiento, pero no hay manera de evitar 2).

    OriginalEl autor miracle173

  2. 0

    Oracle sólo proporciona secuencias numéricas, pero usted puede construir su identificadores mediante la conversión de una cadena, por ejemplo, 'INV' || TO_CHAR(invoice_num.NEXTVAL,'fm00')

    La mente de usted, usted puede ser que necesite más de 2 dígitos, dependiendo del número de registros que está esperando.

    sí debe empezar con INV01 y va a ir max valores… ¿hay alguna forma de manejar, mientras que la creación misma secuencia.
    declarar l_new_seq varchar2(10); begin select ‘INV’ en l_new_seq from dual; ejecución inmediata «Crear la secuencia de seq_inv_num comenzar con» | | l_new_seq || ‘incrementan en 1’; end;
    No, Oracle secuencia sólo se genera números enteros. Si desea cualquier otra cosa que usted tiene que concatenar a algo más cuando después de llamar nextval.

    OriginalEl autor Jeffrey Kemp

Dejar respuesta

Please enter your comment!
Please enter your name here