web-dev-qa-db-fra.com

Comment obtenir le nombre de lignes dans JDBC?

J'ai exécuté une requête JDBC pour obtenir un jeu de résultats. Avant d'itérer dessus, j'aimerais savoir rapidement combien de lignes ont été retournées. Comment puis-je le faire avec des performances élevées?

J'utilise Java 6, Oracle 11g et les derniers pilotes Oracle JDBC.

28
Steve McLeod

Vous devrez le faire en tant que requête distincte, par exemple:

SELECT COUNT(1) FROM table_name

Certains pilotes JDBC peuvent vous le dire, mais il s'agit d'un comportement facultatif et, plus précisément, le pilote peut ne pas encore le savoir. Cela peut être dû à l'optimisation de la requête, par exemple, deux exemples de stratégies d'exécution dans Oracle sont d'obtenir toutes les lignes aussi rapidement que possible ou d'obtenir la première ligne aussi rapidement que possible.

Si vous effectuez deux requêtes distinctes (une un décompte et l'autre la requête), vous devrez les effectuer dans la même transaction. Cela fonctionnera bien sur Oracle mais peut être problématique sur d'autres bases de données (par exemple, SQL Server vous affichera des données non validées ou bloquera une mise à jour externe non validée en fonction de votre niveau d'isolement tandis qu'Oracle prend en charge un niveau d'isolement qui vous donne une vue transactionnellement cohérente de la sans bloquer les mises à jour externes).

Normalement, peu importe le nombre de lignes. En règle générale, ce type de requête est traité par lots ou paginé et de toute façon, vous disposez d'informations de progression sous la forme de lignes chargées/traitées et vous pouvez détecter la fin de l'ensemble de résultats (évidemment).

32
cletus
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! :)
19
thezar

Réponse courte: vous ne pouvez pas.

Réponse longue: vous ne pouvez pas, en partie parce que la base de données évalue paresseusement la requête, ne renvoyant que des lignes lorsque vous les demandez.

EDIT: En utilisant un jeu de résultats déroulant, vous pouvez :)

En effet, j'ai posé cette question dans le groupe de discussion des bases de données Java il y a longtemps (en 2001!)) Et j'ai eu réponses utiles .

18
Jon Skeet

Pour obtenir le nombre de lignes de JDBC:

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

Si votre pilote le prend en charge (!), Vous pouvez appeler ResultSet.afterLast () ResultSet.getRow () ResultSet.beforeFirst (). Les performances peuvent être bonnes ou non.

Une meilleure solution serait de réécrire votre algorithme pour ne pas exiger la taille à l'avance.

4

Sans opérateur ternaire

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.

Avec l'opérateur ternaire une ligne

int rowCount = rs.last() ? rs.getRow() : 0; 
rs.beforeFirst();
2
v8-E

Code:

//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();
0
MindBrain