Question

J'ai exécuté une requête JDBC pour obtenir un jeu de résultats. Avant de parcourir cette page, j'aimerais savoir rapidement combien de lignes ont été renvoyées. Comment puis-je faire cela avec des performances élevées?

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

Était-ce utile?

La solution

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

SELECT COUNT(1) FROM table_name

Certains pilotes JDBC peuvent vous l'indiquer, mais il s'agit d'un comportement facultatif et, plus précisément, il est possible que le pilote ne le sache pas encore. Cela peut être dû à la manière dont la requête est optimisée, par exemple deux stratégies d’exécution sous Oracle consistent à obtenir toutes les lignes le plus rapidement possible ou la première le plus rapidement possible.

Si vous effectuez deux requêtes distinctes (l'une par compte et l'autre par requête), vous devrez les effectuer dans la même transaction. Cela fonctionnera bien sur Oracle mais pourra poser problème sur d’autres bases de données (par exemple, SQL Server vous montrera des données non validées ou bloquera une mise à jour externe non validée en fonction de votre niveau d’isolation, alors qu’Oracle prend en charge un niveau d’isolation qui vous donne une vue cohérente du point de vue de la transaction. données sans blocage sur 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 lot ou paginé. Dans les deux cas, vous disposez d'informations sur la progression sous forme de lignes chargées / traitées et vous pouvez détecter la fin du jeu de résultats (évidemment).

Autres conseils

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! :)

Réponse courte: vous ne pouvez pas.

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

EDIT: En utilisant un ResultSet à défilement vous pouvez:)

En effet, il y a longtemps (en 2001!), j'avais déjà posé cette question dans le groupe de discussion sur les bases de données Java et j'avais réponses utiles .

Pour obtenir le nombre de lignes de JDBC:

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

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

Une meilleure solution serait de réécrire votre algorithme pour ne pas exiger la taille initiale.

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 d'une ligne ternaire

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

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top