web-dev-qa-db-fra.com

java obtenant SQL suivant le numéro de séquence de l'enregistrement avant insertion

J'ai la variable TestingID et une chaîne SQL comme suit dans mon code Java. la chaîne SQL sera utilisée plus tard pour prepareStatement

 int TestingID; 

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

 MethodA(TestingID);     //passing TestingID to MethodA

Je dois obtenir la valeur de séquence suivante de l'enregistrement nouvellement inséré dans la variable TestingID afin de pouvoir l'utiliser dans une autre méthode, comme indiqué ci-dessus.

9
Z.V

En utilisant cette approche, vous devriez d'abord interroger la nouvelle valeur d'identité (je vois que vous utilisez des séquences) ,. Cela peut être fait en émettant un select.

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

Après cela, transmettez-le à la tâche readyStatement en tant qu'argument.

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

À partir de ce moment, vous aurez toujours votre numéro de séquence.

Ce ne sont pas des exemples fonctionnels (pas de capture ou finalement, etc.), mais vous donneront une idée de la façon de le faire;)

27
Cristian Meneses

Au printemps et dans la base de données Oracle, cela devrait fonctionner.

public Long getSequence() {
  org.springframework.jdbc.core.JdbcTemplate jdbcTemplateObject = new JdbcTemplate(dataSource);
  Long seq;
  String sql = "select SEQ_XY.NEXTVAL from dual";
  seq = jdbcTemplateObject.queryForObject(sql, new Object[] {}, Long.class);
  return seq;
}
2
Laszlo Lugosi

Dans Oracle, vous pouvez utiliser 

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

Cela échouera pour HSQL . Vous pouvez modifier l'instruction SQL en ajoutant "en tant que NEXTVAL".

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

suivez les étapes ci-dessous:

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

exemple: 

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

2) vérifiez si la séquence est créée avec succès ..__ en exécutant la commande: 

                       select * from user_sequences;

recherchez le nom " customers_seq "

3) lancer la requête:

exemple de programme: 

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();
0
Naresh Salikanti