Tous les produits
Search
Centre de documentation

Lindorm:Pagination par curseur (en aperçu public)

Dernière mise à jour :Aug 11, 2026

OFFSET/LIMIT La pagination classique analyse et ignore toutes les lignes précédant la page demandée, ce qui entraîne une augmentation linéaire du temps de requête avec la profondeur de la page. La pagination par curseur évite cet écueil en enregistrant la position de la dernière ligne renvoyée et en démarrant la requête suivante directement à partir de cette position. Utilisez la pagination par curseur lorsque la pagination conventionnelle OFFSET/LIMIT s'avère trop lente pour la taille de votre jeu de données.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

Limites

  • La pagination par curseur prend uniquement en charge les requêtes simples. Les requêtes contenant des fonctions d'agrégation (SUM, COUNT), des clauses ORDER BY ou des clauses GROUP BY ne sont pas prises en charge.

  • La pagination par curseur requiert les clauses OFFSET et LIMIT.

Parcourir les résultats

La boucle de pagination suit les quatre étapes suivantes pour chaque requête :

  1. Exécutez la requête de la première page en incluant _l_next_cursor_ dans la liste SELECT (ou utilisez l'indicateur /*+ _l_allow_cursor_ */ pour les requêtes avec caractères génériques).

  2. À partir de l'ensemble de résultats, récupérez la dernière valeur _l_next_cursor_ ; il s'agit du curseur pour la page suivante.

  3. Transmettez ce curseur dans la clause WHERE sous la forme _l_current_cursor_ = '<cursor value>' dans les requêtes suivantes.

  4. Arrêtez le processus lorsque _l_next_cursor_ renvoie null : vous avez atteint la dernière page.

Sélectionnez le style de projection adapté à votre requête :

Style Cas d'utilisation
Projection explicite (recommandée) Vous connaissez les colonnes à renvoyer
Projection implicite Vous avez besoin de toutes les colonnes, y compris les dynamiques (SELECT *)

Projection explicite (recommandée)

Incluez _l_next_cursor_ directement dans la liste des colonnes.

Première page :

SELECT <column_identifier1>, <column_identifier2>, _l_next_cursor_ FROM <table_identifier> LIMIT 0, 5;

Le résultat comprend une colonne _l_next_cursor_ contenant une valeur de curseur VARCHAR pour chaque ligne.

Important

Chaque ligne du résultat possède une valeur _l_next_cursor_. Utilisez la valeur de la dernière ligne comme curseur pour la page suivante.

Pages suivantes :

SELECT <column_identifier1>, <column_identifier2>, _l_next_cursor_ FROM <table_identifier> WHERE _l_current_cursor_ = '<cursor value>' AND <filter condition> LIMIT 5, 5;

Dans la clause WHERE, combinez la condition de curseur et toute condition de filtre d'origine à l'aide de AND.

Projection implicite

Lorsque la liste des colonnes est *, LindormTable renvoie uniquement les colonnes prédéfinies et exclut le curseur. Pour inclure le curseur dans une requête avec caractères génériques, ajoutez l'indicateur /*+ _l_allow_cursor_ */ après SELECT.

Première page :

SELECT /*+ _l_allow_cursor_ */ * FROM <table_identifier> LIMIT 0, 5;

Pages suivantes :

SELECT /*+ _l_allow_cursor_ */ * FROM <table_identifier> WHERE _l_current_cursor_ = '<cursor value>' AND <original filter condition> LIMIT 5, 5;
Remarque

Utilisez la projection implicite lorsque vous ne pouvez pas déterminer les colonnes à l'avance, par exemple lors de l'interrogation de colonnes dynamiques.

Exemples

Les exemples suivants utilisent une table d'exemple contenant 15 lignes pour illustrer la récupération de trois pages de cinq lignes chacune.

Configuration de la table d'exemple :

-- Create a sample table.
CREATE TABLE tb_cursor_test(c1 INT , c2 INT, c3 VARCHAR(50), PRIMARY KEY(c1));

-- Insert data into the table.
UPSERT INTO tb_cursor_test(c1, c3) VALUES (1, 'c3_1'),(2, 'c3_2'),(3, 'c3_3'),(4, 'c3_4'),(5, 'c3_5');
UPSERT INTO tb_cursor_test(c1, c3) VALUES (6, 'c3_6'),(7, 'c3_7'),(8, 'c3_8'),(9, 'c3_9'),(10, 'c3_10');
UPSERT INTO tb_cursor_test(c1, c3) VALUES (11, 'c3_11'),(12, 'c3_12'),(13, 'c3_13'),(14, 'c3_14'),(15, 'c3_15');

Étape 1 : Récupérer la page 1

Important

La requête de la première page doit inclure _l_next_cursor_ dans la liste SELECT pour initialiser la pagination par curseur.

SELECT c1, c2, c3, _l_next_cursor_ FROM tb_cursor_test LIMIT 0, 5;

Sortie :

+----+------+------+------------------------------+
| c1 | c2   | c3   | _l_next_cursor_              |
+----+------+------+------------------------------+
| 1  | null | c3_1 | AAAABIAAAAYFAAAABk5PUk1BTA== |
| 2  | null | c3_2 | AAAABIAAAAYFAAAABk5PUk1BTA== |
| 3  | null | c3_3 | AAAABIAAAAYFAAAABk5PUk1BTA== |
| 4  | null | c3_4 | AAAABIAAAAYFAAAABk5PUk1BTA== |
| 5  | null | c3_5 | AAAABIAAAAYFAAAABk5PUk1BTA== |
+----+------+------+------------------------------+

La valeur _l_next_cursor_ de la dernière ligne est AAAABIAAAAYFAAAABk5PUk1BTA==. Utilisez cette valeur pour récupérer la page 2.

Étape 2 : Récupérer la page 2

SELECT c1, c2, c3, _l_next_cursor_ FROM tb_cursor_test WHERE _l_current_cursor_ = 'AAAABIAAAAYFAAAABk5PUk1BTA==' LIMIT 5, 5;

Sortie :

+----+------+-------+------------------------------+
| c1 | c2   | c3    | _l_next_cursor_              |
+----+------+-------+------------------------------+
| 6  | null | c3_6  | AAAABIAAAAsKAAAABk5PUk1BTA== |
| 7  | null | c3_7  | AAAABIAAAAsKAAAABk5PUk1BTA== |
| 8  | null | c3_8  | AAAABIAAAAsKAAAABk5PUk1BTA== |
| 9  | null | c3_9  | AAAABIAAAAsKAAAABk5PUk1BTA== |
| 10 | null | c3_10 | AAAABIAAAAsKAAAABk5PUk1BTA== |
+----+------+-------+------------------------------+

Le curseur suivant est AAAABIAAAAsKAAAABk5PUk1BTA==. Utilisez-le pour récupérer la page 3.

Étape 3 : Récupérer la page 3

SELECT c1, c2, c3, _l_next_cursor_ FROM tb_cursor_test WHERE _l_current_cursor_ = 'AAAABIAAAAsKAAAABk5PUk1BTA==' LIMIT 10, 5;

Sortie :

+----+------+-------+-----------------+
| c1 | c2   | c3    | _l_next_cursor_ |
+----+------+-------+-----------------+
| 11 | null | c3_11 | null            |
| 12 | null | c3_12 | null            |
| 13 | null | c3_13 | null            |
| 14 | null | c3_14 | null            |
| 15 | null | c3_15 | null            |
+----+------+-------+-----------------+

_l_next_cursor_ vaut null : il s'agit de la dernière page. Arrêtez la pagination ici.