Lze vytvořit pouze celočíselné posloupnosti.
Takže příkaz musí být:
CREATE SEQUENCE invoice_nun
START WITH 1
INCREMENT BY 1;
Načtenou hodnotu můžete převést na řetězec a přidat příslušnou předponu.
select 'INV'||to_char(invoice_nun.nextval,'FM09999999')
from dual;
Můžete vytvořit funkci pro simulaci sekvence vracející příslušné řetězcové hodnoty
create or replace function next_invoice_nun return varchar2
as
begin
return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
end;
/
nyní můžete udělat
select next_invoice_nun
from dual;
Výše definovaná sekvence používá některé výchozí hodnoty. To je zdokumentováno v Databázové SQL Language Reference . Je ekvivalentní následujícímu tvrzení
CREATE SEQUENCE invoice_nun
CACHE 20
NOORDER
START WITH 1
INCREMENT BY 1;
Měli byste si být vědomi následujících skutečností:
1) Pokud transakce načte hodnotu sekvence a vrátí se zpět, hodnota sekvence se ztratí. Pokud tedy provedete následující:
-- 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;
ID faktur INV00000001
and
INV00000003are inserted in the
fakturytable but the invoice id
INV00000002` je ztraceno, protože příkaz, který jej přinesl, byl vrácen zpět
2) Pokud dojde k selhání instance, všechny sekvence, které jsou v mezipaměti instance, jsou ztraceny. Ve vašem příkladu je použita výchozí hodnota pro mezipaměť, která je 20. Pokud tedy instance havaruje, může se ztratit maximálně 20 sekvenčních hodnot. alternativou je použít klíčové slovo NOCYCLE
pokud vytvoříte sekvenci, ale bude to mít za následek snížení výkonu.
3) Pokud jste na systému RAC, pořadové číslo nepředstavuje pořadí načítání příkazu. Je tedy možné, že první příkaz získá id INV00000021
a druhý příkaz získá id INV00000001
pokud je druhý příkaz proveden na jiné instanci než první příkaz. Důvodem je, že instance načetla prvních 20 čísel sekvencí ve své mezipaměti a druhá instance načetla druhých 20 čísel sekvencí ve své mezipaměti. První příkaz se provede na instanci, která načetla druhých 20 sekvenčních čísel. Můžete použít ORDER
klíčové slovo, abyste se tomu vyhnuli, ale opět to povede ke snížení výkonu
Takže se lze vyhnout 2) a 3) za cenu výkonnostních sankcí, ale neexistuje způsob, jak se vyhnout 2).