Oracle
 sql >> Database >  >> RDS >> Oracle

Creazione di una sequenza Oracle che inizia con alfanumerico

È possibile creare solo sequenze con valori interi.

Quindi la dichiarazione deve essere:

CREATE SEQUENCE invoice_nun
  START WITH 1
  INCREMENT BY 1;

Puoi convertire il valore recuperato in una stringa e aggiungere un prefisso appropriato.

select 'INV'||to_char(invoice_nun.nextval,'FM09999999') 
  from dual;

Puoi creare una funzione per simulare una sequenza che restituisce valori di stringa appropriati

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

ora puoi farlo

select next_invoice_nun 
  from dual;

La sequenza come definita sopra utilizza alcuni valori predefiniti. Ciò è documentato nel Riferimento al linguaggio SQL del database . È equivalente alla seguente affermazione

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

Dovresti essere consapevole di quanto segue:

1) Se una transazione recupera un valore di sequenza e torna indietro, il valore di sequenza viene perso. Quindi, se fai quanto segue:

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

gli ID fattura INV00000001and INV00000003are inserted in the fatturetable but the invoice id INV00000002` è perso perché è stato eseguito il rollback dell'istruzione che l'ha recuperata

2) Se un'istanza si arresta in modo anomalo, tutte le sequenze che si trovano nella cache dell'istanza vengono perse. Nel tuo esempio viene utilizzato il valore predefinito per la cache che è 20. Quindi, se le istanze si arrestano in modo anomalo al massimo, 20 valori di sequenza possono essere persi. un'alternativa è usare la parola chiave NOCYCLE se crei la sequenza, ma questo comporterà penalità di prestazione.

3) Se sei su un sistema RAC, il numero di sequenza non rappresenta l'ordine di recupero dell'estratto conto. Quindi è possibile che la prima istruzione ottenga l'id INV00000021 e la seconda istruzione ottiene l'id INV00000001 se la seconda istruzione viene eseguita su un'istanza diversa dalla prima istruzione. Questo perché l'istanza ha recuperato i primi 20 numeri di sequenza nella sua cache e l'altra istanza ha recuperato i secondi 20 numeri di sequenza nella sua cache. La prima istruzione viene eseguita sull'istanza che ha recuperato i secondi 20 numeri di sequenza. Puoi utilizzare il ORDER parola chiave per evitarlo, ma anche in questo caso si comporterà una penalizzazione delle prestazioni

Quindi si possono evitare 2) e 3) al prezzo di penalità di prestazione, ma non c'è modo di evitare 2).