Maison >base de données >tutoriel mysql >ROWNUM dans Oracle : comment obtenir une pagination appropriée et éviter les pièges courants ?

ROWNUM dans Oracle : comment obtenir une pagination appropriée et éviter les pièges courants ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-19 06:18:10528parcourir

ROWNUM in Oracle: How to Achieve Proper Pagination and Avoid Common Pitfalls?

Oracle ROWNUM et Pagination : problèmes courants et solutions

Cet article aborde les défis fréquents rencontrés lors de l'utilisation de ROWNUM pour la pagination dans Oracle SQL.

Problème 1 : Clause WHERE inefficace avec ROWNUM

Pourquoi SELECT * FROM Person WHERE rownum > 100 ne renvoie-t-il aucun résultat ?

ROWNUM est attribué après la phase de filtrage initiale (prédicat). Étant donné qu'une valeur ROWNUM n'est incrémentée qu'après affectation, une valeur supérieure à 1 ne peut pas être directement sélectionnée à l'aide d'une clause WHERE de cette manière. Aucune ligne ne satisfait à la condition ROWNUM > 100.

Problème 2 : ROWNUM BETWEEN Limitations

Pourquoi WHERE rownum BETWEEN lowerBound AND upperBound ne convient-il pas à la pagination ?

Cette syntaxe est également inefficace car l'affectation ROWNUM précède l'évaluation de la clause WHERE. Oracle ne peut pas sélectionner directement une plage de ROWNUM valeurs.

Solution : Oracle 12c et au-delà (limitation des n premières lignes)

Oracle 12c a introduit une approche supérieure : "Top-n Row Limiting" utilisant OFFSET et FETCH. Par exemple :

<code class="language-sql">SELECT empno, sal
FROM   emp
ORDER BY sal
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;</code>

Cela récupère efficacement les lignes 5 à 8 (décalage 4, récupération 4). Cette méthode est préférée aux techniques reposant uniquement sur ROWNUM.

Problème 3 : Masquer la colonne ROWNUM

Comment pouvons-nous empêcher la colonne ROWNUM d'apparaître dans l'ensemble de résultats ?

Répertoriez simplement uniquement les colonnes souhaitées dans l'instruction SELECT externe. Alternativement, dans SQL*Plus, vous pouvez utiliser la commande NOPRINT pour supprimer la sortie de colonnes spécifiques.

Problème 4 : Assurer une pagination correcte avec ROWNUM (anciennes versions d'Oracle)

Est-ce que ROWNUM peut obtenir une pagination correcte ?

Oui, mais cela nécessite une structure de requête imbriquée :

<code class="language-sql">SELECT val
FROM   (SELECT val, rownum AS rnum
        FROM   (SELECT val
                FROM   t
                ORDER BY val)
        WHERE rownum <= 8)
WHERE  rnum >= 5;</code>

Cela récupère correctement les lignes 5 à 8. La requête interne attribue ROWNUM, les filtres de requête du milieu en fonction de la limite supérieure et les filtres de requête externes en fonction de la limite inférieure. Cependant, la méthode OFFSET/FETCH reste l'option la plus efficace et la plus lisible dans Oracle 12c et versions ultérieures.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn