Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So verwenden Sie Oracle DB-Sequenzen, ohne die nächste Sequenznummer im Falle eines Rollbacks zu verlieren

Aus meiner Sicht sollten Sie eine Reihenfolge verwenden und sich keine Gedanken mehr über Lücken machen.

Aus Ihrer Sicht würde ich sagen, dass es schlechter ist, die Reihenfolge zu ändern als einen Tisch zu haben. Beachten Sie, dass der Zugriff auf diese Tabelle auf einen einzelnen Benutzer beschränkt sein muss, andernfalls erhalten Sie doppelte Werte, wenn zwei (oder mehr) Benutzer gleichzeitig darauf zugreifen.

Hier ist ein Beispielcode; Schau es dir an, benutze/passe es an, wenn du willst.

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>