Cela peut être dû à un certain nombre de raisons, y compris le pilote que vous utilisez. A) Certains pilotes n'autorisent pas les instructions imbriquées. Selon que votre pilote prend en charge JDBC 3.0, vous devez vérifier le troisième paramètre lors de la création de l'objet Statement. Par exemple, j'ai eu le même problème avec le pilote JayBird à Firebird, mais le code a bien fonctionné avec le pilote postgres. Ensuite, j'ai ajouté le troisième paramètre à l'appel de méthode createStatement et l'ai défini sur ResultSet.HOLD_CURSORS_OVER_COMMIT, et le code a également fonctionné correctement pour Firebird. B) Il pourrait y avoir un bogue dans votre code.
static void testNestedRS() throws SQLException {
Connection con =null;
try {
// GET A CONNECTION
con = ConexionDesdeArchivo.obtenerConexion("examen-dest");
String sql1 = "select * from reportes_clasificacion";
Statement st1 = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
ResultSet rs1 = null;
try {
// EXECUTE THE FIRST QRY
rs1 = st1.executeQuery(sql1);
while (rs1.next()) {
// THIS LINE WILL BE PRINTED JUST ONCE ON
// SOME DRIVERS UNLESS YOU CREATE THE STATEMENT
// WITH 3 PARAMETERS USING
// ResultSet.HOLD_CURSORS_OVER_COMMIT
System.out.println("ST1 Row #: " + rs1.getRow());
String sql2 = "select * from reportes";
Statement st2 = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// EXECUTE THE SECOND QRY. THIS CLOSES THE FIRST
// ResultSet ON SOME DRIVERS WITHOUT USING
// ResultSet.HOLD_CURSORS_OVER_COMMIT
st2.executeQuery(sql2);
st2.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs1.close();
st1.close();
}
} catch (SQLException e) {
} finally {
con.close();
}
}
Souvenez-vous que vous ne pouvez pas réutiliser l'objet Statement, une fois que vous avez réexécuté une requête sur le même objet d'instruction, tous les resultsets ouverts associés à l'instruction sont fermés. Assurez-vous de ne pas fermer la déclaration.
Ajoutez une liste de votre code. – JeeBee