Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Criando sequência Oracle que começa com alfanumérico


Somente sequências de valor inteiro podem ser criadas.

Portanto, a declaração deve ser:
CREATE SEQUENCE invoice_nun
  START WITH 1
  INCREMENT BY 1;

Você pode converter o valor obtido em uma string e adicionar um prefixo apropriado.
select 'INV'||to_char(invoice_nun.nextval,'FM09999999') 
  from dual;

Você pode criar uma função para simular uma sequência retornando valores de string apropriados
create or replace function next_invoice_nun return varchar2
  as
  begin
  return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
  end;
/ 

agora você pode fazer
select next_invoice_nun 
  from dual;

A sequência conforme definida acima usa alguns valores padrão. Isso está documentado na Referência da linguagem SQL do banco de dados . É equivalente à seguinte afirmação
CREATE SEQUENCE invoice_nun
  CACHE 20
  NOORDER
  START WITH 1
  INCREMENT BY 1;

Você deve estar ciente do seguinte:

1) Se uma transação buscar um valor de sequência e reverter, o valor de sequência será perdido. Então, se você fizer o seguinte:
-- 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;

os códigos de fatura INV00000001and INV00000003are inserted in the faturastable but the invoice id INV00000002` foi perdido porque a instrução que o buscou foi revertida

2) Se uma instância travar, todas as sequências que estão no cache da instância são perdidas. No seu exemplo, o valor padrão para o cache é usado, que é 20. Portanto, se as instâncias travarem, no máximo 20 valores de sequência podem ser perdidos. uma alternativa é usar a palavra chave NOCYCLE se você criar a sequência, mas isso trará penalidades de desempenho.

3) Se você estiver em um sistema RAC o número de seqüência não representa a ordem de busca da instrução. Portanto, é possível que a primeira instrução obtenha o id INV00000021 e a segunda instrução obtém o id INV00000001 se a segunda instrução for executada em uma instância diferente da primeira. Isso ocorre porque a instância buscou os primeiros 20 números de sequência em seu cache e a outra instância buscou os segundos 20 números de sequência em seu cache. A primeira instrução é executada na instância que buscou os segundos 20 números de sequência. Você pode usar o ORDER palavra-chave para evitar isso, mas isso novamente trará penalidades de desempenho

Portanto, pode-se evitar 2) e 3) pelo preço das penalidades de desempenho, mas não há como evitar 2).