sql >> Base de Datos >  >> RDS >> Oracle

Cómo usar secuencias de Oracle DB sin perder el siguiente número de secuencia en caso de reversión

Desde mi punto de vista, deberías usar una secuencia y dejar de preocuparte por los espacios.

Desde tu punto de vista, yo diría que alterar la secuencia es peor que tener una mesa. Tenga en cuenta que el acceso a esa tabla debe estar restringido a un solo usuario; de lo contrario, obtendrá valores duplicados si dos (o más) usuarios acceden simultáneamente.

Aquí hay un código de muestra; echa un vistazo, úsalo/ajústalo si quieres.

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>