Je gebruikt dus een Oracle database.
Oplossing:
1. creeer een tabel met een numeriek PK
2. creeer een cyclische sequence pk_tabel met als max waarde de maximaal toegestane waarde van de PK.
3. Maak een stored proc met daarin de volgende code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| select pk_tabel.nextval
into temp_var
from dual;
BEGIN
WHILE 1=1
DO
select pk_tabel.nextval
into temp1
from tabel
where pk = temp_var;
temp_var := temp1;
ENDWHILE
EXCEPTION when no_data_found
then /* waarde wordt nog niet gebruikt */
END |
Deze proc laat je dan de waarde van temp_var terug geven als key.
Het loopje zorgt ervoor dat je de nummering opnieuw kan laten beginnen bij 1 (of 0) en dat hij zelf de gaten vindt in de nummering.
Dit nummer gebruik je dan om te inserten. de sequence zorgt ervoor dat twee opvragingen na elkaar ieder een volgnd nummer krijgen ondanks dat de transactie nog niet beeindigd is.
suc6
PS vergeet al die oplossingen met ROWID = MAX() die zin syntaktisch onzin en bovendien moet je nooit de rowid gebruiken. Die is voor Oracle intern kan ook veranderen voor een record in de tijd. Een hogere ROWID zegt ook niets over het tijdstip van insert, maar over de fysieke locatie van het record.