tiene resultados procedimientos fila conjunto almacenados actual java oracle jdbc

procedimientos - el conjunto de resultados no tiene fila actual java



Comportamiento de la consulta SELECT usando executeUpdate (6)

Este comportamiento contradice definitivamente la API Statement.executeUpdate . Lo que es interesante, la API java.sql.Driver.jdbcCompliant dice "Un controlador solo puede informar verdadero aquí si supera las pruebas de conformidad JDBC". oracle.jdbc.OracleDriver.jdbcCompliant - devuelve verdadero. También probé com.mysql.jdbc.Driver.jdbcCompliant - devuelve falso. Pero en la misma situación que usted describe arroja

Exception in thread "main" java.sql.SQLException: Can not issue SELECT via executeUpdate().

Parece que los controladores JDBC son impredecibles.

Me encontré con un comportamiento extraño al ejecutar una consulta SELECT usando Statement#executeUpdate() por error. Mientras que el Javadoc establece claramente que executeUpdate() throws SQLException si la instrucción SQL dada produce un objeto ResultSet. Pero cuando estoy ejecutando SELECT * from TABLE_NAME , no recibo ninguna excepción. En cambio, obtengo un valor de retorno que es el mismo que el no. de filas seleccionadas, si no. es menor o igual a 10. Si el no. es más de 10, el valor de retorno siempre es 10.

Connection conn; Statement stmt; try { conn = getConnection(); stmt = conn.createStatement(); int count = stmt.executeUpdate("SELECT * from TABLE_NAME"); log.info("row count: " + count); } catch (SQLException e) { log.error(e); // handle exception } finally { DbUtils.closeQuietly(stmt); DbUtils.closeQuietly(conn); }

Estoy usando Oracle 10g .

¿Me estoy perdiendo algo aquí o depende de los conductores definir su propio comportamiento?


La consulta que está utilizando no produce un ResultSet pero afecta a las Filas obviamente. Es por eso que no obtienes una SQLException, sino un recuento del número de filas afectadas. El misterio es por qué no va más allá de 10. Puede ser Oracle JDBC Driver Implementation Specific.


Según las especificaciones, el método Statement.executeUpdate() devuelve the row count for SQL Data Manipulation Language (DML) .

UPD : intento hacer una suposición sobre el resultado devuelto (que siempre es <= 10 ). Parece que la implementación de la declaración de Oracle devuelve aquí la cantidad de dicho premature batch count (según las fuentes desensambladas de la clase OraclePreparedStatement). Esto de alguna manera está vinculado a las declaraciones de actualización. Puede ser que este valor sea igual a 10 por defecto.

UPD-2: De acuerdo con esto: Extensiones de rendimiento : The premature batch flush count is summed to the return value of the next executeUpdate() or sendBatch() method.


Su consulta SQL es para recuperar todas las filas de table_name. Por lo tanto, puede usar el método execute() lugar del método executeUpdate() . Porque el método posterior generalmente se usa cuando su tarea está relacionada con el lenguaje de manipulación de la base de datos, como la consulta de actualización.


utilizar

int count = stmt.executeQuery ("SELECT * from TABLE_NAME") ;

en lugar de

int count = stmt.executeUpdate ("SELECT * from TABLE_NAME") ;

para obtener el total no. de filas


Para el caso genérico (seleccionar o actualizar):

Statement st = conn.createStatement(); st.execute(sql);