Il est un peu en retard, mais si quelqu'un utilise ORACLE, vient ici la solution de sueur:
SELECT
q.*,
ROWNUM DB_ROWNUM,
(SELECT max(ROWNUM) FROM ($sql)) DB_COUNT
FROM
($sql) q
$ sql est votre requête, bien sûr. Oracles optimiseur est assez intelligent pour ne pas tout exécuter deux fois.
Maintenant, chaque ligne récupérée contient le numéro de ligne actuel (utile pour la numérotation des lignes de la grille de pagination) dans DB_ROWNUM et le nombre total de lignes dans DB_COUNT. Vous devez toujours chercher au moins une ligne (donc ce n'est pas exactement la réponse à la question ci-dessus;)), mais l'utilisation de sueur vient ensuite:
C'est aussi un moyen très facile de démarrer et de limiter dans Oracle et toujours obtenir le nombre total de lignes:
SELECT * FROM (
SELECT /*+ FIRST_ROWS($limit) */
q.*,
ROWNUM DB_ROWNUM,
(SELECT max(ROWNUM) FROM ($sql)) DB_COUNT
FROM
($sql) q
WHERE
ROWNUM <= $limit
)
WHERE
DB_ROWNUM > $start
Avec cela, vous pouvez réellement chercher uniquement la ligne 51 à 100 pour la deuxième page dans votre réseau, mais toujours le nombre réel de ligne (à partir de 1) et la compte complet (sans début et limite) dans chaque ligne récupérée.
La clé ici était mon incompréhension de ce que fetch fait. Je pensais qu'il récupérait une sorte de hachage et que je l'itéra simplement, mais, en fait, le tout est un flux, alors, vous récupérez des lignes directement à partir de la BD (et non d'un objet retourné), donc, l'exécution préparée n'a vraiment aucune idée du nombre de lignes renvoyées. –