2013-08-01 10 views
9

Mam zmienną TestingID i następujący ciąg sql w moim kodzie java. ciąg sql zostanie później użyty dla prepareStatement.java uzyskiwanie następnego numeru sekwencji SQL rekordu przed wstawieniem

int TestingID; 

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

MethodA(TestingID);  //passing TestingID to MethodA 

trzeba uzyskać następną wartość sekwencji nowo włożonego do TestingID zapisu tak, że można go wykorzystywać w inny sposób, jak przedstawiono powyżej.

Odpowiedz

24

Stosując to podejście, należy najpierw zapytać o nową wartość tożsamości (widzę, że używasz sekwencji). Można to zrobić, wydając polecenie wyboru.

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

Następnie należy przekazać do argumentu Przygotowane jako argument.

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

Od tego momentu zawsze będziesz mieć swój numer porządkowy.

Nie są to przykłady funkcjonalne (nie łapać czy wreszcie itp), ale daje wyobrażenie, jak to zrobić;)

+1

Jest prawdopodobnie sposobem na uniknięcie dodatkowe 'select' za pomocą składni' return into'. –

+1

Oczywiście, ale zapewniam rodzajową aplikację przy użyciu składni oracle dla praktycznego przykładu. RETURN INTO nie będzie działał dla SQL Server, ponieważ musisz użyć procedury przechowywanej, aby wykonać tę samą operację, oraz CallableStatement do zarejestrowania parametru out. W przypadku DB2 można wykonać tylko SELECT do SYSIBM.SYSDUMMY1 i tak dalej ... –

0

W Oracle można użyć

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

To nie dla HSQL. Możesz zmodyfikować wyrażenie sql, dodając "jako NEXTVAL".

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

należy wykonać następujące czynności:

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

przykład:

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

2) sprawdzenia, czy sekwencja jest utworzony. przez wykonującego polecenia:

     select * from user_sequences; 

czek na imię "customers_seq"

3) uruchomić kwerendę:

przykładowy program:

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(); 
Powiązane problemy