È 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 INV00000001
and
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).