Oracle
 sql >> база данни >  >> RDS >> Oracle

Създаване на Oracle последователност, която започва с буквено-цифрови

Могат да се създават само последователности с цели числа.

Така че изявлението трябва да бъде:

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;

идентификаторите на фактурите INV00000001and 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).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-12560:TNS:грешка в адаптера на протокола

  2. Извличане на резултат от анонимен PLSQL блок

  3. Идентифицирайте телефонни номера в PL/SQL итерация

  4. Сравнението на датата на Oracle е нарушено поради DST

  5. Ефективно четене и импортиране на CSV файлове в Oracle PL/SQL