Pourquoi est-While (rs.next()) déclaration se terminant après le 1er itération?
Je suis l'aide d'une instruction SELECT pour obtenir des données d'une table, puis l'insérer dans une autre table. Cependant, la ligne "stmt.executeQuery(query);" est l'insertion de la première ligne de la table puis se ferme. Quand je commente cette ligne, le tout en boucle parcourt toutes les lignes de l'impression de l'en sortir. La stacktrace n'est pas visible des erreurs. Pourquoi est-ce arrivé?
try{
String query = "SELECT * FROM "+schema_name+"."+table;
rs = stmt.executeQuery(query);
while (rs.next()) {
String bundle = rs.getString("BUNDLE");
String project_cd = rs.getString("PROJECT_CD");
String dropper = rs.getString("DROPPER");
String week = rs.getString("WEEK");
String drop_dt = rs.getString("DROP_DT").replace(" 00:00:00.0","");
query = "INSERT INTO INDUCTION_INFO (BUNDLE, PROJECT_CD, DROPPER, WEEK, DROP_DT) "
+ "VALUES ("
+ bundle+","
+ "'"+project_cd+"',"
+ dropper+","
+ week+","
+ "to_date('"+drop_dt+"','YYYY-MM-DD'))";
System.out.println(query);
stmt.executeQuery(query);
}
}catch(Exception e){
e.printStackTrace();
}
- Hm ... en fait je ne sais pas si l'appel de
executeUpdate()
sur une déclaration ferme que les déclarations précédentesResultSet
. Et je suis trop paresseux pour le test de ce droit maintenant ... - La question précise est déjà répondu, mais comme un constat: vous devriez être en utilisant une instruction préparée et la modification de la lie des variables à chaque fois au lieu de construire une nouvelle plaquette avec les valeurs codées en dur dans. (Il semble comme un endroit improbable pour obtenir une injection SQL, mais dépend qui peuvent ajouter des entrées dans la table source...). Mais pourquoi ne pas simplement le faire en un seul coup avec un select-que-insérer, au lieu de boucle?
Vous devez vous connecter pour publier un commentaire.
Vous sont re-utiliser le
Statement
qui a été utilisé pour produirers
sur la dernière ligne de votre boucle.Cela permet de fermer l'
ResultSet
rs
. Comme indiqué dans la documentation:Vous avez besoin d'utiliser une deuxième
Statement
objet pour exécuter laINSERT
consolidés.Statement
objets ne peut faire qu'une chose à la fois, de sorte que lorsque vous exécutez cetteINSERT
, vous invalidez leResultSet
qui il a généré. Vous aurez besoin de créer un deuxièmeStatement
objet pour effectuer leINSERT
.De la Déclaration de la documentation: "Par défaut, un seul objet ResultSet par la Déclaration de l'objet peuvent être ouvertes en même temps. Par conséquent, si la lecture d'un objet ResultSet est entrelacé avec la lecture de l'autre, chacun doit avoir été généré par les différents Déclaration des objets. Toutes les méthodes d'exécution dans l'état de l'interface implicitement à proximité d'une déclaration actuel de l'objet ResultSet si l'un ouvert existe."
si vous utilisez la même déclaration, il annule le précédent jeu de résultats. Vous devriez utiliser une autre instruction pour effectuer les mises à jour/inserts.
C'est du Java docs de l'interface Déclaration:
Afin de mieux vous besoin d'une seconde
Statement
ou encore mieux, unPreparedStatement
.Et à l'exécution d'une INSERTION de l'instruction SQL, vous devez utiliser
executeUpdate()
au lieu deexecuteQuery()
.