Oracle
 sql >> Database >  >> RDS >> Oracle

Come utilizzare le sequenze Oracle DB senza perdere il numero di sequenza successivo in caso di rollback

Dal mio punto di vista, dovresti usare una sequenza e smettere di preoccuparti delle lacune.

Dal tuo punto di vista, direi che alterare la sequenza è peggiore che avere un tavolo. Tieni presente che l'accesso a quella tabella deve essere limitato a un singolo utente, altrimenti otterrai valori duplicati se due (o più) utenti vi accedono contemporaneamente.

Ecco un codice di esempio; dai un'occhiata, usa/regola se vuoi.

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>