sql >> Databasteknik >  >> RDS >> Oracle

Skapar Oracle-sekvens som börjar med alfanumerisk

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 INV00000001and 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).



  1. PHP &PDO:Anslut till MySQL med IPv6-adress

  2. Hur uppdaterar och tar man bort listan Visa data i SQLite-databas med klicklyssnare?

  3. Kan inte komma åt tillfälliga tabeller från en funktion

  4. Det gick inte att skapa Eclipse Data Source till Oracle 12c med 12c jar. Men 11g fungerar