sql >> Database >  >> RDS >> Oracle

Oracle-reeks maken die begint met alfanumeriek

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



  1. juiste slaapstand-annotatie voor byte[]

  2. FLASH as3 kan php-webadres van localhost niet identificeren

  3. Seconden toevoegen aan datetime in MySQL

  4. Primaire sleutels retourneren van een gekoppelde server in SQL Server (T-SQL-voorbeelden)