2013-08-01 5 views
9

erhalten Ich habe TestingID Variable und eine SQL-Zeichenfolge wie folgt in meinem Java-Code. Die SQL-Zeichenfolge wird später für prepareStatement verwendet.Java SQL nächste Sequenznummer des Datensatzes vor dem Einfügen

int TestingID; 

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

MethodA(TestingID);  //passing TestingID to MethodA 

ich brauche den nächsten Sequenzwert des neu eingefügten Datensatz in die TestingID zu bekommen, so dass ich es in einem anderen Verfahren verwendet werden kann, wie oben gezeigt.

Antwort

24

Mit diesem Ansatz sollten Sie zuerst nach dem neuen Identitätswert abfragen (ich sehe, dass Sie Sequenzen verwenden). Dies kann durch Ausgabe einer Auswahl erfolgen.

// 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); 

Danach übergeben Sie es als Argument an die preparedStatement.

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

Von diesem Punkt haben Sie immer Ihre Sequenznummer.

Dies sind keine Funktionsbeispiele (kein Haken oder schließlich, etc), aber Sie werden eine Vorstellung davon, wie es zu tun;)

+1

Wahrscheinlich gibt es eine Möglichkeit, zu vermeiden das zusätzliche 'select' durch Verwendung der 'Returning in'-Syntax. –

+1

Natürlich, aber ich gebe ein generisches Apporach mit Orakel-Syntax für ein praktisches Beispiel. RETURN INTO würde für SQL Server nicht funktionieren, da Sie eine gespeicherte Prozedur verwenden müssen, um dieselbe Operation auszuführen, und eine CallableStatement, um den out-Parameter zu registrieren. Für DB2 können Sie nur eine SELECT-Operation für SYSIBM.SYSDUMMY1 durchführen usw. –

0

In Oracle Sie

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

Dies wird fehlschlagen können für HSQL. Sie können die SQL-Anweisung ändern, indem Sie "als NEXTVAL" hinzufügen.

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

folgende Schritte vor:

    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 } ]; 

Beispiel:

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

2) überprüfen, ob die Sequenz erfolgreich erstellt wurde. durch Ausführen-Befehl:

     select * from user_sequences; 

Prüfung für den Namen "customers_seq"

3) die Abfrage ausführen:

Beispielprogramm:

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();