preparedstatement one from example java jdbc resultset

java - one - ¿Cómo obtengo el recuento de filas en JDBC?



resultset java example (7)

He ejecutado una consulta JDBC para obtener un conjunto de resultados. Antes de iterar sobre él, me gustaría saber rápidamente cuántas filas se devolvieron. ¿Cómo puedo hacer esto con un alto rendimiento?

Estoy usando Java 6, Oracle 11g y los últimos controladores Oracle JDBC.


Código:

//Create a Statement class to execute the SQL statement Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS COUNT FROM TABLENAME"); while(rs.next()) { System.out.println("The count is " + rs.getInt("COUNT")); } //Closing the connection con.close();


Para obtener el número de filas de JDBC:

ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME"); rs.next(); int count = rs.getInt(1);


Respuesta corta: no puedes.

Respuesta larga: no se puede, en parte porque la base de datos puede evaluar la consulta de forma perezosa, solo devolviendo las filas a medida que las solicita.

EDITAR: Usando un ResultSet desplazable puedes :)

De hecho, hice esta misma pregunta en el grupo de noticias de bases de datos de Java hace mucho tiempo (¡en 2001!) Y tuve algunas respuestas útiles .


Si su controlador lo admite (!), Puede llamar a ResultSet.afterLast () ResultSet.getRow () ResultSet.beforeFirst (). El rendimiento puede o no ser bueno.

Una mejor solución sería reescribir su algoritmo para no requerir el tamaño por adelantado.


Tendrá que hacer esto como una consulta separada, por ejemplo:

SELECT COUNT(1) FROM table_name

Algunos controladores JDBC pueden decirte, pero este es un comportamiento opcional y, más concretamente, el controlador puede no saber aún. Esto puede deberse a la forma en que se optimiza la consulta; por ejemplo, dos estrategias de ejecución de ejemplo en Oracle son obtener todas las filas lo más rápido posible o obtener la primera fila lo más rápido posible.

Si realiza dos consultas por separado (una por conteo y la otra por consulta), deberá hacerlo dentro de la misma transacción. Esto funcionará bien en Oracle pero puede ser problemático en otras bases de datos (por ejemplo, SQL Server mostrará datos no confirmados o bloqueará una actualización externa no comprometida dependiendo de su nivel de aislamiento, mientras que Oracle admite un nivel de aislamiento que le brinda una vista transaccionalmente consistente del datos sin bloqueo en actualizaciones externas).

Aunque normalmente no importa cuántas filas hay. Normalmente, este tipo de consulta se procesa por lotes o se busca y, en cualquier caso, tiene información de progreso en forma de filas cargadas / procesadas y puede detectar el final del conjunto de resultados (obviamente).


Sin operador ternario

rs.last(); // Moves the cursor to the last row in this ResultSet object. int rowCount = rs.getRow(); //Retrieves the current row number. rs.beforeFirst(); //Moves the cursor to the front of this ResultSet object,just before the first row.

Con operador ternario una línea

int rowCount = rs.last() ? rs.getRow() : 0; rs.beforeFirst();


ResultSet rs = stmt.executeQuery(sql); int rowCount = rs.last() ? rs.getRow() : 0; // Number of rows in result set. Don''t forget to set cyrsor to beforeFirst() row! :)