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

Como usar sequências de banco de dados Oracle sem perder o próximo número de sequência em caso de reversão


Do meu ponto de vista, você deve usar uma sequência e parar de se preocupar com lacunas.

Do seu ponto de vista, eu diria que alterar a sequência é pior do que ter uma mesa. Observe que o acesso a essa tabela deve ser restrito a um único usuário, caso contrário, você obterá valores duplicados se dois (ou mais) usuários acessarem simultaneamente.

Aqui está um código de exemplo; dê uma olhada, use/ajuste se quiser.
SQL> create table broj (redni_br number not null);

Table created.

SQL>
SQL> create or replace function f_get_broj
  2     return number
  3  is
  4     pragma autonomous_transaction;
  5     l_redni_br   broj.redni_br%type;
  6  begin
  7         select b.redni_br + 1
  8           into l_redni_br
  9           from broj b
 10     for update of b.redni_br;
 11
 12     update broj b
 13        set b.redni_br = l_redni_br;
 14
 15     commit;
 16     return (l_redni_br);
 17  exception
 18     when no_data_found
 19     then
 20        lock table broj in exclusive mode;
 21
 22        insert into broj (redni_br)
 23             values (1);
 24
 25        commit;
 26        return (1);
 27  end f_get_broj;
 28  /

Function created.

SQL> select f_get_broj from dual;

F_GET_BROJ
----------
         1

SQL> select f_get_broj from dual;

F_GET_BROJ
----------
         2

SQL>