Endast heltalsvärderade sekvenser kan skapas.
Så påståendet måste vara:
CREATE SEQUENCE invoice_nun
START WITH 1
INCREMENT BY 1;
Du kan konvertera det hämtade värdet till en sträng och lägga till ett lämpligt prefix.
select 'INV'||to_char(invoice_nun.nextval,'FM09999999')
from dual;
Du kan skapa en funktion för att simulera en sekvens som returnerar lämpliga strängvärden
create or replace function next_invoice_nun return varchar2
as
begin
return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
end;
/
du kan nu göra
select next_invoice_nun
from dual;
Sekvensen som definieras ovan använder vissa standardvärden. Detta finns dokumenterat i Databas SQL Language Reference . Det motsvarar följande påstående
CREATE SEQUENCE invoice_nun
CACHE 20
NOORDER
START WITH 1
INCREMENT BY 1;
Du bör vara medveten om följande:
1) Om en transaktion hämtar ett sekvensvärde och rullar tillbaka går sekvensvärdet förlorat. Så om du gör följande:
-- 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;
faktura-id:t INV00000001
and
INV00000003are inserted in the
fakturatable but the invoice id
INV00000002` har gått förlorad eftersom uttalandet som hämtade det återställdes
2) Om en instans kraschar går alla sekvenser som finns i instansens cache förlorade. I ditt exempel används standardvärdet för cache som är 20. Så om instanserna kraschar kan högst 20 sekvensvärden gå förlorade. ett alternativ är att använda nyckelordet NOCYCLE
om du skapar sekvensen men detta kommer att medföra prestationsstraff.
3) Om du är på ett RAC-system representerar inte sekvensnumret ordningen för att hämta uttalandet. Så det är möjligt att den första satsen får id:t INV00000021
och den andra satsen får ID:t INV00000001
om den andra satsen exekveras på en annan instans än den första satsen. Detta beror på att instansen hämtade de första 20 sekvensnumren i sin cache och den andra instansen hämtade de andra 20 sekvensnumren i sin cache. Den första satsen exekveras på instansen som hämtade de andra 20 sekvensnumren. Du kan använda ORDER
sökord för att undvika detta, men detta kommer återigen att medföra prestationsstraff
Så man kan undvika 2) och 3) för priset av prestationsstraff men det finns inget sätt att undvika 2).