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).