sql >> Database teknologi >  >> RDS >> Oracle

Oprettelse af Oracle-sekvens, der starter med alfanumerisk

Der kan kun oprettes sekvenser med heltalværdi.

Så udsagnet skal være:

OPRET SEKVENS invoice_nun START MED 1 FORØG MED 1; 

Du kan konvertere den hentede værdi til en streng og tilføje et passende præfiks.

vælg 'INV'||to_char(invoice_nun.nextval,'FM09999999') fra dual; 

Du kan oprette en funktion til at simulere en sekvens, der returnerer passende strengværdier

opret eller erstat funktion next_invoice_nun return varchar2 as begin return('INV'||to_char(invoice_nun.nextval,'FM09999999') ); ende;/  

du kan nu gøre

vælg next_invoice_nun fra dual; 

Sekvensen som defineret ovenfor bruger nogle standardværdier. Dette er dokumenteret i Database SQL Language Reference . Det svarer til følgende udsagn

CREATE SEQUENCE invoice_nun CACHE 20 NOORDER START MED 1 FORVÆG MED 1; 

Du skal være opmærksom på følgende:

1) Hvis en transaktion henter en sekvensværdi og ruller tilbage, går sekvensværdien tabt. Så hvis du gør følgende:

-- hente faktura_id INV00000001indsæt i fakturaer(faktura_id,...) værdier (næste_faktura_nun,...); commit;-- hent faktura_id INV00000002indsæt i fakturaer(faktura_id,...) værdier (næste_faktura_nun,...);rollback;-- hent faktura_id INV00000003indsæt i fakturaer(faktura_id,...)værdier (n_invoice_n...),værdier (nexnt_invo); begå;

faktura-id'erne INV00000001og INV00000003er indsat i fakturatabel, men faktura-id INV00000002` går tabt, fordi den erklæring, der hentede den, blev rullet tilbage

2) Hvis en instans går ned, går alle sekvenser, der er i instansens cache, tabt. I dit eksempel bruges standardværdien for cache, som er 20. Så hvis forekomsterne går ned, kan højst 20 sekvensværdier gå tabt. et alternativ er at bruge søgeordet NOCYCLE hvis du opretter sekvensen, men dette vil medføre præstationsstraf.

3) Hvis du er på et RAC-system, repræsenterer sekvensnummeret ikke rækkefølgen for at hente sætningen. Så det er muligt, at den første sætning får id'et INV00000021 og den anden sætning får id'et INV00000001 hvis den anden sætning udføres på en anden instans end den første sætning. Dette skyldes, at instansen hentede de første 20 sekvensnumre i sin cache, og den anden instans hentede de anden 20 sekvensnumre i sin cache. Den første sætning udføres på den instans, der hentede de anden 20 sekvensnumre. Du kan bruge ORDER søgeord for at undgå dette, men dette vil igen medføre ydeevnestraffe

Så man kan undgå 2) og 3) til prisen for præstationsstraf, men der er ingen måde at undgå 2).



  1. Laravel veltalende grænse i forhold, der har underforhold

  2. Kan der være begrænsninger med samme navn i en DB?

  3. Forskellen mellem SQL og NoSQL

  4. 4 måder at vise alle visninger i MySQL