2013-08-01 7 views
9

Ho una variabile TestingID e una stringa sql come segue nel mio codice java. la stringa sql verrà in seguito utilizzata per prepareStatement.java ottenere SQL numero sequenza successiva del record prima dell'inserimento

int TestingID; 

String sqlInsert = "INSERT INTO TESTING VALUES(TESTING_SEQ.NEXTVAL, ?, ?)"; 
... 

MethodA(TestingID);  //passing TestingID to MethodA 

ho bisogno di ottenere il valore della sequenza successiva del record appena inserito nel TestingID modo che possa utilizzarla in un altro metodo, come mostrato sopra.

risposta

24

Utilizzando tale approccio, è necessario eseguire prima la query per il nuovo valore di identità (vedo che stai utilizzando sequenze). Questo può essere fatto emettendo una selezione.

// This example is for Oracle 

String sqlIdentifier = "select TESTING_SEQ.NEXTVAL from dual"; 
PreparedStatement pst = conn.prepareStatement(sqlIdentifier); 
synchronized(this) { 
    ResultSet rs = pst.executeQuery(); 
    if(rs.next()) 
    long myId = rs.getLong(1); 

Dopodiché, passarlo al PreparedStatement come argomento.

... 
String sqlInsert = "INSERT INTO TESTING VALUES(?, ?, ?)"; 
PreparedStatement pst = conn.prepareStaetment(sqlInsert); 
pst.setLong(1, myId); 
... 

Da quel punto, avrete sempre il numero di sequenza.

Questi non sono esempi di funzionamento (nessun fermo o, infine, ecc), ma vi darà un'idea di come farlo;)

+1

C'è probabilmente un modo per evitare l'extra 'select' usando la sintassi' return into'. –

+1

Ovviamente, ma sto fornendo un apporoach generico usando la sintassi di Oracle per un esempio pratico. RETURN INTO non funzionerebbe per SQL Server, poiché è necessario utilizzare una stored procedure per eseguire la stessa operazione e un CallableStatement per registrare il parametro out. Per DB2, è possibile eseguire solo SELECT a SYSIBM.SYSDUMMY1 e così via ... –

0

In Oracle è possibile utilizzare

long myId = rs.getLong("NEXTVAL"); 

Questo fallirà per HSQL. È possibile modificare l'istruzione sql aggiungendo "come NEXTVAL".

String sqlIdentifier = "select TESTING_SEQ.NEXTVAL as NEXTVAL from dual"; 
0

i passaggi che seguono:

    1) create sequence in database by using the following query. 
CREATE SEQUENCE sequence_name 
[START WITH start_num] 
[INCREMENT BY increment_num] 
[ { MAXVALUE maximum_num | NOMAXVALUE } ] 
[ { MINVALUE minimum_num | NOMINVALUE } ] 
[ { CYCLE | NOCYCLE } ] 
[ { CACHE cache_num | NOCACHE } ] 
[ { ORDER | NOORDER } ]; 

esempio:

CREATE SEQUENCE customers_seq 
START WITH  1000 
INCREMENT BY 1 
NOCACHE 
NOCYCLE; 

2) verificare se la sequenza viene creato correttamente. con il comando eseguendo:

     select * from user_sequences; 

di controllo per il nome di "customers_seq"

3) Eseguire la query:

programma di esempio:

Statement stmt= connection.createStatement(); 

ResultSet rs = stmt.executeQuery("SELECT customers_seq.NEXTVAL FROM dual"); 

if (rs!=null && rs.next()) { 
int cust_id = rs.getInt(1); 
sysout(cust_id); 
rs.close(); 
} 

stmt.close(); 
con.close();