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


Я хочу создать последовательность, которая будет начинаться с символа inv и увеличиваться на 1

Значения, которые должны быть

INV01
INV02
INV03  
etc...
CREATE SEQUENCE invoice_nun
START WITH "INV"
INCREMENT BY 1
2 4

2 ответа:

Могут быть созданы только целочисленные последовательности.

Таким образом, утверждение должно быть:

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;

Идентификаторы счетов-фактурINV00000001andINV00000003are inserted in theсчета-фактуры table but the invoice idINV00000002` теряются, так как оператор, который получил их, был откатан

2) если экземпляр аварийно завершает работу, все последовательности, находящиеся в кэше экземпляра, теряются. В вашем примере по умолчанию для кэша используется значение 20. Таким образом, если экземпляры аварийно завершают работу не более 20 значений последовательности могут быть потеряны. alter native должен использовать ключевое слово NOCYCLE, Если вы создаете последовательность, но это приведет к снижению производительности.

3) Если вы находитесь в системе RAC, порядковый номер не представляет порядок извлечения оператора. Таким образом, возможно, что первый оператор получает идентификатор INV00000021 , а второй оператор получает идентификатор INV00000001, если второй оператор выполняется на a другой экземпляр, чем первое утверждение. Это происходит потому, что экземпляр извлек первые 20 номеров последовательностей в своем кэше, а другой экземпляр извлек вторые 20 номеров последовательностей в своем кэше. Первый оператор выполняется на экземпляре, который получил вторые 20 порядковых номеров. Вы можете использовать ключевое слово ORDER, чтобы избежать этого, но это снова приведет к снижению производительности

Таким образом, можно избежать 2) и 3) за цену штрафов за исполнение, но нет никакого способа избегайте 2).

Oracle предоставляет только числовые последовательности, но вы можете построить свои идентификаторы, преобразовав их в строку, например 'INV' || TO_CHAR(invoice_num.NEXTVAL,'fm00')

Обратите внимание, что вам может потребоваться более 2 цифр, в зависимости от того, сколько записей вы ожидаете.