Esto podría deberse a varias razones, incluido el controlador que está utilizando.
a) Algunos controladores no permiten declaraciones anidadas. Dependiendo de si su controlador admite JDBC 3.0, debe verificar el tercer parámetro al crear el objeto Statement. Por ejemplo, tuve el mismo problema con el controlador de JayBird para Firebird, pero el código funcionaba bien con el controlador de postgres. Luego agregué el tercer parámetro a la llamada al método createStatement y lo configuré en ResultSet.HOLD_CURSORS_OVER_COMMIT, y el código también funcionó bien para Firebird.
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();
}
}
b) Puede haber un error en su código. Recuerde que no puede reutilizar el objeto Statement, una vez que vuelva a ejecutar una consulta en el mismo objeto de declaración, se cerrarán todos los resultados abiertos asociados con la declaración. Asegúrese de no cerrar la declaración.
Agregue un listado de su código. – JeeBee