Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erstellen einer Oracle-Sequenz, die mit alphanumerisch beginnt

Es können nur Sequenzen mit ganzzahligen Werten erstellt werden.

Die Anweisung muss also lauten:

CREATE SEQUENCE invoice_nun
  START WITH 1
  INCREMENT BY 1;

Sie können den abgerufenen Wert in einen String umwandeln und ein entsprechendes Präfix hinzufügen.

select 'INV'||to_char(invoice_nun.nextval,'FM09999999') 
  from dual;

Sie können eine Funktion erstellen, um eine Sequenz zu simulieren, die geeignete Zeichenfolgenwerte zurückgibt

create or replace function next_invoice_nun return varchar2
  as
  begin
  return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
  end;
/ 

können Sie jetzt tun

select next_invoice_nun 
  from dual;

Die oben definierte Sequenz verwendet einige Standardwerte. Dies ist in der Datenbank-SQL-Sprachreferenz dokumentiert . Es entspricht der folgenden Anweisung

CREATE SEQUENCE invoice_nun
  CACHE 20
  NOORDER
  START WITH 1
  INCREMENT BY 1;

Sie sollten Folgendes beachten:

1) Wenn eine Transaktion einen Sequenzwert abruft und zurückrollt, geht der Sequenzwert verloren. Wenn Sie also Folgendes tun:

-- 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;

die Rechnungs-IDs INV00000001and INV00000003are inserted in the eingefügt Rechnungentable but the invoice id INV00000002` ist verloren gegangen, da die Anweisung, die es abgerufen hat, zurückgesetzt wurde

2) Wenn eine Instanz abstürzt, gehen alle Sequenzen verloren, die sich im Cache der Instanz befinden. In Ihrem Beispiel wird der Standardwert für den Cache verwendet, der 20 ist. Wenn also die Instanz abstürzt, können höchstens 20 Sequenzwerte verloren gehen. alternativ kann das Schlüsselwort NOCYCLE verwendet werden Wenn Sie die Sequenz erstellen, führt dies jedoch zu Leistungseinbußen.

3) Wenn Sie sich auf einem RAC-System befinden, stellt die Sequenznummer nicht die Reihenfolge dar, in der die Anweisung abgerufen wird. Es ist also möglich, dass die erste Anweisung die ID INV00000021 erhält und die zweite Anweisung erhält die ID INV00000001 wenn die zweite Anweisung auf einer anderen Instanz als die erste Anweisung ausgeführt wird. Dies liegt daran, dass die Instanz die ersten 20 Sequenznummern in ihrem Cache abgerufen hat und die andere Instanz die zweiten 20 Sequenznummern in ihrem Cache abgerufen hat. Die erste Anweisung wird auf der Instanz ausgeführt, die die zweiten 20 Sequenznummern abgerufen hat. Sie können den ORDER verwenden Schlüsselwort, um dies zu vermeiden, aber auch dies führt zu Leistungseinbußen

Man kann also 2) und 3) für den Preis von Leistungseinbußen vermeiden, aber es gibt keine Möglichkeit, 2) zu vermeiden.