Создание последовательности Oracle, которая начинается с буквенно-цифровых символов
Я хочу создать последовательность, которая будет начинаться с символа inv
и увеличиваться на 1
Значения, которые должны быть
INV01
INV02
INV03
etc...
CREATE SEQUENCE invoice_nun
START WITH "INV"
INCREMENT BY 1
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;
Идентификаторы счетов-фактур
INV00000001
and
INV00000003are inserted in the
счета-фактурыtable but the invoice id
INV00000002` теряются, так как оператор, который получил их, был откатан2) если экземпляр аварийно завершает работу, все последовательности, находящиеся в кэше экземпляра, теряются. В вашем примере по умолчанию для кэша используется значение 20. Таким образом, если экземпляры аварийно завершают работу не более 20 значений последовательности могут быть потеряны. alter native должен использовать ключевое слово
3) Если вы находитесь в системе RAC, порядковый номер не представляет порядок извлечения оператора. Таким образом, возможно, что первый оператор получает идентификаторNOCYCLE
, Если вы создаете последовательность, но это приведет к снижению производительности.INV00000021
, а второй оператор получает идентификаторINV00000001
, если второй оператор выполняется на a другой экземпляр, чем первое утверждение. Это происходит потому, что экземпляр извлек первые 20 номеров последовательностей в своем кэше, а другой экземпляр извлек вторые 20 номеров последовательностей в своем кэше. Первый оператор выполняется на экземпляре, который получил вторые 20 порядковых номеров. Вы можете использовать ключевое словоORDER
, чтобы избежать этого, но это снова приведет к снижению производительностиТаким образом, можно избежать 2) и 3) за цену штрафов за исполнение, но нет никакого способа избегайте 2).