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 INV00000001
and
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.