Można tworzyć tylko sekwencje o wartościach całkowitych.
Zatem oświadczenie musi brzmieć:
CREATE SEQUENCE invoice_nun
START WITH 1
INCREMENT BY 1;
Możesz przekonwertować pobraną wartość na ciąg i dodać odpowiedni przedrostek.
select 'INV'||to_char(invoice_nun.nextval,'FM09999999')
from dual;
Możesz utworzyć funkcję symulującą sekwencję zwracającą odpowiednie wartości ciągu
create or replace function next_invoice_nun return varchar2
as
begin
return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
end;
/
możesz teraz zrobić
select next_invoice_nun
from dual;
Sekwencja zdefiniowana powyżej wykorzystuje pewne wartości domyślne. Jest to udokumentowane w Informacji o języku bazy danych SQL . Jest to odpowiednik następującego oświadczenia
CREATE SEQUENCE invoice_nun
CACHE 20
NOORDER
START WITH 1
INCREMENT BY 1;
Powinieneś mieć świadomość następujących kwestii:
1) Jeśli transakcja pobierze wartość sekwencji i wycofa się, wartość sekwencji zostanie utracona. Jeśli więc wykonasz następujące czynności:
-- 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;
identyfikatory faktur INV00000001
and
INV00000003are inserted in the
fakturytable but the invoice id
INV00000002` zostało utracone, ponieważ instrukcja, która go pobrała, została wycofana
2) Jeśli instancja ulegnie awarii, wszystkie sekwencje znajdujące się w pamięci podręcznej instancji zostaną utracone. W twoim przykładzie używana jest domyślna wartość pamięci podręcznej, która wynosi 20. Jeśli więc instancje ulegną awarii, co najwyżej 20 wartości sekwencji może zostać utraconych. alternatywą jest użycie słowa kluczowego NOCYCLE
jeśli utworzysz sekwencję, ale spowoduje to obniżenie wydajności.
3) Jeśli jesteś w systemie RAC, numer kolejny nie reprezentuje kolejności pobierania wyciągu. Możliwe więc, że pierwsza instrukcja otrzyma identyfikator INV00000021
a druga instrukcja otrzymuje identyfikator INV00000001
jeśli druga instrukcja jest wykonywana w innej instancji niż pierwsza instrukcja. Dzieje się tak, ponieważ instancja pobrała pierwsze 20 numerów sekwencji ze swojej pamięci podręcznej, a druga instancja pobrała drugie 20 numerów sekwencji ze swojej pamięci podręcznej. Pierwsza instrukcja jest wykonywana na instancji, która pobrała drugie 20 numerów sekwencyjnych. Możesz użyć ORDER
słowo kluczowe, aby tego uniknąć, ale to znowu przyniesie kary za wydajność
Można więc uniknąć 2) i 3) za cenę kar za wyniki, ale nie ma sposobu, aby uniknąć 2)).