PDA

View Full Version : Domanda DB - INSERT e get ID



NoeX
9th September 2008, 20:19
Ciao a tutti, come si legge dalla firma sto sviluppando una applicazione in Java EE con HTML+JS <-> Servlets <-> Session Bean <-> Entities con Hibernate.
Per una parte dell'applicativo devo fare Servlets(a dire il vero sarebbe mejo che fosse il Session Bean ma per ora lo fà la servlet e bona) + JDBC

problema:
DB: Oracle 10g
devo fare una normale insert into <nome tabella> ...

per inserire un nuovo record, solo che mi ritorna il num di righe inserite, io voglio che mi ritorni l'ID del record che ho inserito perchè mi serve saperlo, come faccio a farlo ?

Non voglio fare select sulla SEQUENCE di proposito perchè
1) se leggo il nextval mi aumenta il num della sequenza
2) non voglio problemi di concorrenza


thanks in advance

Tanek
9th September 2008, 20:56
La prima cosa che mi viene in mente così su due piedi è fare la query di insert e subito dopo senza chiudere la connection prendere il currval della sequence. (alternativamente puoi prenderlo prima della insert e incrementarlo ovviamente)
Quanta probabilità c'è che questa operazione sia eseguita contemporaneamente da più utenti?

Altrimenti se hai un'altra chiave (non pk ma comunque unique rispetto alla tabella e funzionalmente identificativa del record) rientri in select con quella.

NoeX
9th September 2008, 21:25
La prima cosa che mi viene in mente così su due piedi è fare la query di insert e subito dopo senza chiudere la connection prendere il currval della sequence. (alternativamente puoi prenderlo prima della insert e incrementarlo ovviamente)
Quanta probabilità c'è che questa operazione sia eseguita contemporaneamente da più utenti?

Altrimenti se hai un'altra chiave (non pk ma comunque unique rispetto alla tabella e funzionalmente identificativa del record) rientri in select con quella.



grazie della risposta prima di tutto, volendo si potrebbe fare una select di tutti i dati appena inseriti, e si ottiene, il problema è che non c'è garanzia al 100% che sia univoco il risultato. Nel mio caso dovrebbe andare bene, ma io volevo la soluzione 'ottima' :p

Anche il currval è una buona scelta per questo caso, ma volevo sapere se esiste la soluzione ottima tale da avere la sicurezza che quell'ID corrisponde al 100% al record inserito

Gate
10th September 2008, 08:16
se fai un'insert mi sa che e' gia' unico, per sovrascrivere dovresti fare un'update

Gate
10th September 2008, 08:26
anzi devi creare prima una unique constraint sulla colonna ID, cosi' hai la certezza che sia univoco .. se provi a fare insert ti dice
CONSTRAINT VIOLATA
puoi solo updatarla

Ladro di anime
10th September 2008, 08:31
Fai il lock della tabella, sparati il max dell id, fatti l insert, ottieni il numero di righe e con quei 2 dati sai il range di id che hai inserito.

NoeX
10th September 2008, 09:42
grazie a tutti, ho detto una cazzata prima e la ho anche verificata (almeno in Oracle).
Lascio ai posteri la soluzione

In oracle ogni connessione è indipendente dalle altre, vale a dire che se

connessione 1 fà, select sequencename.nextval from dual ritorna 28
connessione 2 fà, select sequencename.nextval from dual ritorna 29

connessione 1 fà, select sequencename.currval from dual ritorna 28


grazie a tutti ^^