sql >> Databasteknik >  >> RDS >> Oracle

Hur man använder Oracle DB-sekvenser utan att förlora nästa sekvensnummer vid återställning

Ur min synvinkel bör du använda en sekvens och sluta oroa dig för luckor.

Ur din synvinkel skulle jag säga att det är värre att ändra sekvensen än att ha ett bord. Observera att åtkomst till den tabellen måste begränsas till en enskild användare, annars får du dubbletter av värden om två (eller flera) användare får åtkomst till den samtidigt.

Här är en exempelkod; ta en titt, använd/justera det om du vill.

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. Automatiskt sätt att konvertera XML-filer till SQL-databas?

  2. Varför måste vi använda främmande nycklar?

  3. Hur infogar man rumslig data i MySQL med PHP?

  4. Hur genererar man en virtuell tabell för att generera en sekvens av datum i PostgreSQL?