Alleen reeksen met een integerwaarde kunnen worden gemaakt.
Dus de verklaring moet zijn:
CREATE SEQUENCE invoice_nun
START WITH 1
INCREMENT BY 1;
U kunt de opgehaalde waarde converteren naar een tekenreeks en een geschikt voorvoegsel toevoegen.
select 'INV'||to_char(invoice_nun.nextval,'FM09999999')
from dual;
U kunt een functie maken om een reeks te simuleren die de juiste tekenreekswaarden retourneert
create or replace function next_invoice_nun return varchar2
as
begin
return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
end;
/
je kunt nu doen
select next_invoice_nun
from dual;
De volgorde zoals hierboven gedefinieerd gebruikt enkele standaardwaarden. Dit is gedocumenteerd in de Database SQL-taalreferentie . Het komt overeen met de volgende verklaring
CREATE SEQUENCE invoice_nun
CACHE 20
NOORDER
START WITH 1
INCREMENT BY 1;
Je moet op de hoogte zijn van het volgende:
1) Als een transactie een reekswaarde ophaalt en terugdraait, gaat de reekswaarde verloren. Dus als je het volgende doet:
-- 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;
de factuur-ID's INV00000001
and
INV00000003are inserted in the
facturentable but the invoice id
INV00000002` is verloren gegaan omdat de instructie die deze heeft opgehaald, is teruggedraaid
2) Als een instantie crasht, gaan alle reeksen in de cache van de instantie verloren. In uw voorbeeld wordt de standaardwaarde voor cache gebruikt die 20 is. Dus als de instanties crashen, kunnen er maximaal 20 reekswaarden verloren gaan. een alternatief is het gebruik van het trefwoord NOCYCLE
als je de reeks maakt, maar dit levert prestatiestraffen op.
3) Als u een RAC-systeem gebruikt, vertegenwoordigt het volgnummer niet de volgorde van het ophalen van de verklaring. Het is dus mogelijk dat de eerste instructie de id INV00000021
. krijgt en de tweede instructie krijgt de id INV00000001
als de tweede instructie wordt uitgevoerd op een andere instantie dan de eerste instructie. Dit komt omdat de instantie de eerste 20 reeksnummers in zijn cache heeft opgehaald en de andere instantie de tweede 20 reeksnummers in zijn cache heeft opgehaald. De eerste instructie wordt uitgevoerd op de instantie die de tweede 20 volgnummers heeft opgehaald. U kunt de ORDER
. gebruiken zoekwoord om dit te vermijden, maar dit zal opnieuw leiden tot prestatiestraffen
Dus je kunt 2) en 3) vermijden voor de prijs van prestatiestraffen, maar er is geen manier om 2) te vermijden.