Results 1 to 7 of 7

Thread: Domanda DB - INSERT e get ID

  1. #1
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default Domanda DB - INSERT e get ID

    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
    I will be back, eventually.

  2. #2
    Tanek's Avatar
    Join Date
    Apr 2004
    Location
    Milano, Midgard
    Posts
    11.225

    Default

    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.

    Tanek™: Game Designer & Algorithm Mastermind, Team Leader & SW Engineer and Dungeon Master!
    "Datte Foco"™ and "Ma KITTESENCULA"™ are registered trademarks of Tanek Entertainment Inc.
    ‎"One of these days, scientists will discover that second X chromosome contains nothing but nonsense and twaddle." - Sheldon Cooper
    Per non dimenticare:
    Spoiler


  3. #3
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    Quote Originally Posted by Tanek View Post
    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'

    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
    I will be back, eventually.

  4. #4
    Lieutenant Gate's Avatar
    Join Date
    Jan 2004
    Location
    Vietato fumareeeeee
    Posts
    4.516

    Default

    se fai un'insert mi sa che e' gia' unico, per sovrascrivere dovresti fare un'update

  5. #5
    Lieutenant Gate's Avatar
    Join Date
    Jan 2004
    Location
    Vietato fumareeeeee
    Posts
    4.516

    Default

    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

  6. #6
    Warrant Officer Ladro di anime's Avatar
    Join Date
    Apr 2004
    Location
    Trieste
    Posts
    2.802

    Default

    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.

  7. #7
    Warrant Officer
    Join Date
    Nov 2003
    Location
    Suisse
    Posts
    2.969

    Default

    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 ^^
    I will be back, eventually.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
[Output: 62.13 Kb. compressed to 52.56 Kb. by saving 9.56 Kb. (15.39%)]