Newsgroup: it.comp.java
Titolo: [Oracle] Record appena inserito

Ho una tabella in Oracle, il cui campo chiave č un numero autoincrementato
(ho usato una sequence + un trigger).
Vorrei ricavare il valore di questo campo (matricola) per il record appena
inserito.
C'č un metodo (generale, applicabile anche in altri casi) che puņ risolvere
il problema (non mi interessa l'ultimo record, perchč nel frattempo, da
un'altra postazione client, altri potrebbero aver fatto quasi
contemporaneamente altri inserimenti).
Grazie.
rotman


Io posso consigliarti di prenderti il valore della sequence ed inserire il
record specificando il valore appena trovato; in questo modo, sai come lo
valorizzi.
Ciao,
Luigi

 appena inserito.
Ho capito qual'č il problema, ma non vedo grosse soluzioni se non quella di 
rileggere la tabella. C'č un errore progettuale: non dovresti far generare 
la matricola al trigger ma farla generare dall'applicativo, in questo modo 
non perdi traccia del record. Altrimenti mettere la matricola come 
alternate key e impostare la chiave con un codice applicativo.


Usa delle stored procedure per inserire i record, in modo che ti ritornino
il valore del record inserito.

 il valore del record inserito.
Lo avevo pensato (tempo fa ho avuto lo stesso problema con asp e cosě ho
risolto).
Piccoli esempi?
Grazie.
rotman
Grazie anche agli altri per gli ottimi consigli.

 contemporaneamente altri inserimenti).
Che versione del driver usi? Mi pare che la specifica 3.0 del JDBC prenda in
considerazione proprio casi come il tuo.

 contemporaneamente altri inserimenti).
Ecco, guarda qua:

 contemporaneamente altri inserimenti).
Ecco, guarda qua:
http://www-106.ibm.com/developerworks/java/library/j-jdbcnew/
Retrieving auto-generated keys
To address the common need to obtain the value of an auto-generated or
auto-incremented key, the JDBC 3.0 API now makes it painless to obtain this
value. To determine the value of any generated keys, simply specify in the
statement's execute() method an optional flag denoting that you are
interested in the generated value. Your level of interest can either be
Statement.RETURN_GENERATED_KEYS or Statement.NO_GENERATED_KEYS. After
executing the statement, the values for the generated keys are obtained by
retrieving a ResultSet from a Statement's instance method,
getGeneratedKeys(). The ResultSet contains a row for each generated key. The
example in Listing 1 creates a new author and returns the corresponding
auto-generated key.
Listing 1. Retrieving an auto-generated key
Statement stmt = conn.createStatement();
// Obtain the generated key that results from the query.
stmt.executeUpdate("INSERT INTO authors " +
                   "(first_name, last_name) " +
                   "VALUES ('George', 'Orwell')",
                   Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if ( rs.next() ) {
    // Retrieve the auto generated key(s).
    int key = rs.getInt(1);
}

Retrieving auto-generated keys
...
Bellissimo ed utilissimo. Peccato che con MySql  alla riga:
stmt.executeUpdate("INSERT INTO test (name) VALUES
('Mauri')",Statement.RETURN_GENERATED_KEYS);
si pianti brutalmente con un secco:
java.lang.AbstractMethodError:
com.mysql.jdbc.jdbc2.Statement.executeUpdate(Ljava/lang/String;I)I
Driver non compatibile (quel jdbc2 mi fa pensare...)?
-- 
Art. 11: L'italia ripudia la guerra come strumento di offesa
alla libertà degli altri popoli e come mezzo di risoluzione 
delle controversie internazionali. 

 Driver non compatibile (quel jdbc2 mi fa pensare...)?
Mah, io non ti capisco: ci ho messo esattamente 30 secondi ad andare su
www.mysql.com
, nella pagina dedicata al driver jdbc nell'ultima release
(3.0.qualcosa), 
http://www.mysql.com/downloads/api-jdbc-stable.html
 a
leggere le release notes, e trovare che dalla versione 3.0.0 in poi il
driver supporta JDBC 3, tra cui, come dice la pagina:
- JDBC-3.0 functionality including
Statement/PreparedStatement.getGeneratedKeys() and ResultSet.getURL()
Questo mi fa pensare che tu stia usando una versione vecchia del driver,
oppure che la versione sia giusta, ma tu istanzi la classe sbagliata
(com.mysql.jdbc.jdbc2 mi fa pensare che ci siano magari alberi diversi per
il driver che supporta jdbc3 o jdbc2, e che magari dipenda dalla classe con
cui inizializzi il driver manager o quel che usi).
La domanda č: ma la documentazione del driver, te la sei letta? O vai per
tentativi? Secondo me non si va lontano, con questa seconda strategia, nel
mondo java.

Mah, io non ti capisco: ci ho messo esattamente 30 secondi 
Chiedo scusa per la "topica"; a mia parziale discolpa posso solo dire
che l'ultima volta che avevo guardato il sito di MySql il driver 3.0
stable non c'era (e non č passato davvero molto tempo...)
Grazie comunque per l'info...
-- 
Art. 11: L'italia ripudia la guerra come strumento di offesa
alla libertą degli altri popoli e come mezzo di risoluzione 
delle controversie internazionali. 

 Grazie comunque per l'info...
Niente di grave, ma fidati, la prossima volta! ;)

 Grazie comunque per l'info...
Niente di grave, ma fidati, la prossima volta! ;)

Con mysql ho scarito i driver JDBC3.0 e tutto funziona (a proposito...
grazie!).
Poi, oggi, ho fatto dei test con Oracle (ho scaricato il jar + aggiornato
ojdbc14.jar ) ma il test č andato male....
java.sql.SQLException: Funzione non supportata
 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
 at
oracle.jdbc.dbaccess.DBError.throwUnsupportedFeatureSqlException(DBError.jav
a:689)
 at
oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:7337)
 at it.penta_si.dati.ImpiegatoDB.insert(ImpiegatoDB.java:56)
 at it.penta_si.dati.ImpiegatoDB.main(ImpiegatoDB.java:153)
Non riesco a capire che versione dei driver JDBC č... mi sa tanto che č la
2... ma non sono stato capace di leggerlo da nessuna parte!!!
rotman

 2... ma non sono stato capace di leggerlo da nessuna parte!!!
In effetti dei driver oracle girano sempre decine di versioni differenti:
colpa loro che di solito li mettono in un package dal nome decisamente poco
esplicativo (di solito mi pare fosse classes12.zip ...). Comunque anche in
questo caso sono sicuro che se scarichi l'ultima versione da 
otn.oracle.com
ottieni un driver jdbc 3 compatibile (almeno a grandi linee e per
funzionalità importanti come questa!). A meno che magari il jdbc 3 l'abbiano
fatto solo per oracle 9i e tu usi l'8i, ma non credo: se non è
all'avanguardia Oracle nel settore dei driver jdbc non c'è più religione.

 2... ma non sono stato capace di leggerlo da nessuna parte!!!
no, considerato che parla di "unsupported feature" la vedo male: non ti
resta che spulciare la documentazione e chiarirti le idee su come Oracle
supporti jdbc 3 o meno! Ehm: magari poi potresti postare le info che hai
trovato qui sul NG, sono interessanti! ;-)