Могат да се създават само последователности с цели числа.
Така че изявлението трябва да бъде:
CREATE SEQUENCE invoice_nun
START WITH 1
INCREMENT BY 1;
Можете да конвертирате извлечената стойност в низ и да добавите подходящ префикс.
select 'INV'||to_char(invoice_nun.nextval,'FM09999999')
from dual;
Можете да създадете функция за симулиране на последователност, връщаща подходящи стойности на низ
create or replace function next_invoice_nun return varchar2
as
begin
return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
end;
/
вече можете да направите
select next_invoice_nun
from dual;
Последователността, както е дефинирана по-горе, използва някои стойности по подразбиране. Това е документирано в справочника за SQL език на базата данни . Това е еквивалентно на следното твърдение
CREATE SEQUENCE invoice_nun
CACHE 20
NOORDER
START WITH 1
INCREMENT BY 1;
Трябва да сте наясно със следното:
1) Ако транзакция извлече стойност на последователност и се върне назад, тогава стойността на последователността се губи. Така че, ако направите следното:
-- 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;
идентификаторите на фактурите INV00000001
and
INV00000003are inserted in the
фактуриtable but the invoice id
INV00000002` е загубен, защото операторът, който го е извлякъл, е върнат назад
2) Ако даден екземпляр се срине, всички последователности, които са в кеша на екземпляра, се губят. Във вашия пример се използва стойността по подразбиране за кеша, която е 20. Така че, ако екземплярите се сринат, най-много 20 стойности на последователност могат да бъдат загубени. алтернатива е да използвате ключовата дума NOCYCLE
ако създадете последователността, но това ще доведе до наказания за производителност.
3) Ако сте на RAC система, поредният номер не представлява реда на извличане на израза. Така че е възможно първият израз да получи идентификатор INV00000021
и второто изявление получава идентификатор INV00000001
ако вторият оператор се изпълни на различен екземпляр от първия оператор. Това е така, защото екземплярът извлече първите 20 номера на последователности в своя кеш, а другият екземпляр извлече вторите 20 номера на последователности в своя кеш. Първият оператор се изпълнява на екземпляра, който извлича вторите 20 последователни номера. Можете да използвате ORDER
ключова дума, за да избегнете това, но това отново ще доведе до наказания за ефективност
Така че човек може да избегне 2) и 3) на цената на санкциите за изпълнение, но няма начин да избегне 2).