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

Sådan bruges Oracle DB-sekvenser uden at miste det næste sekvensnummer i tilfælde af roll-back

Fra mit synspunkt bør du bruge en sekvens og stoppe med at bekymre dig om huller.

Fra dit synspunkt vil jeg sige, at det er værre at ændre rækkefølgen end at have et bord. Bemærk, at adgangen til den tabel skal være begrænset til en enkelt bruger, ellers får du dublerede værdier, hvis to (eller flere) brugere får adgang til den samtidigt.

Her er en prøvekode; kig, brug/juster det hvis du vil.

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>


  1. MySql SELECT union for forskellige kolonner?

  2. vælg indstillingsværdi fra database på valgt

  3. MySQL:Sammenlign MELLEM tid

  4. MySQL til PostgreSQL tabel oprette konvertering - tegnsæt og sortering