Pagination en DQL

De EjnTricks
Révision de 19 février 2016 à 11:54 par Etienne (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

Toutes applications avec une liste se doit d'avoir une pagination des résultats. Jusqu'à la version 6.6 du content server, celle-ci était à la charge du développeur afin de parcourir les résultats d'une requête et d'atteindre la plage souhaitée.

A partir de cette version, la fonction RETURN_RANGE a été introduite et va permettre de laisser la base de données gérer cette pagination. Cet article présente quelque cas d'utilisation.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Study icon.png Enoncé

L'objectif est de mettre en place une pagination sur le contenu d'un répertoire, /Temp/Jobs dans ce cas celui où sont stockées les traces des jobs. La pagination sera réalisée avec cinq éléments par page.


Process-icon.png Utilisation

La documentation de référence DQL indique l'utilisation RETURN_RANGE starting_row ending_row [optimize_top_row] 'sorting_clause', dotn les arguments sont les suivants.

Paramètre Valeur
starting_row Ligne de départ dans la pagination.
ending_row Ligne de fin dans la pagination.
optimize_top_row Permet de spécifier les lignes à optimiser lors pour le parsing.

Paramètre optionel.

sorting_clause La syntaxe est la même que pour les clause ORDER BY d'une requête.

Contient le tri à appliquer avant d'extraire la "page" souhaitée. L'ordre de tri par défaut est ASC.

Attention, cette syntaxe s'applique dans une instruction ENABLE (...) en fin de requête DQL.


Icon-log.png Exemple

La requête de recherche des répertoires est la suivante.

SELECT r_object_id, object_name
FROM dm_folder
WHERE FOLDER('/Temp/Jobs', descend)
ORDER BY object_name

Les résultats, 20 lignes, sont les suivants sur la plateforme utilisé.

r_object_id       object_name
================  ====================================

0ba447c280003503  dce_Clean
0ba447c2800025ca  dm_ContentWarning
0ba447c280002608  dm_DBWarning
0ba447c28006a631  dm_DMClean
0ba447c2800019c2  dm_DataDictionaryPublisher
0ba447c2800028f1  dm_FTCreateEvents
0ba447c280020e1c  dm_FTIndexAgentBoot
0ba447c280021901  dm_Initialize_WQ
0ba447c28006a624  dm_LogPurge
0ba447c2800001b3  dm_PostUpgradeAction
0ba447c280043c5e  dm_QmPriorityAging
0ba447c280043cdf  dm_QmPriorityNotification
0ba447c280043c57  dm_QmThresholdNotification
0ba447c280002680  dm_StateOfDocbase
0ba447c28000263f  dm_UpdateStats
0ba447c280043cda  dm_WFReporting
0ba447c280043c5a  dm_WFSuspendTimer
0ba447c28002fb95  dm_WfmsTimer
0ba447c280021d01  dm_bpm_XCPAutoTaskMgmt
0ba447c280026583  dm_usageReport

En effectuant une pagination de 5 élément par page, les bornes seront calculées ainsi.

  • 1 à 5;
  • 6 à 10;
  • 11 à 15;
  • 16 à 20.

Malgré que le paramètre optimize_top_row soit obligatoire, celui-ci sera renseigné avec la valeur 5, toutes les lignes du sous espace seront optimisées dans le retour.

SELECT r_object_id, object_name
FROM dm_folder
WHERE FOLDER('/Temp/Jobs', descend)
ENABLE (RETURN_RANGE 1 5 5 'object_name')
r_object_id       object_name                  dm_rnum
================  ===========================  =======

0ba447c280003503  dce_Clean                    1
0ba447c2800025ca  dm_ContentWarning            2
0ba447c280002608  dm_DBWarning                 3
0ba447c28006a631  dm_DMClean                   4
0ba447c2800019c2  dm_DataDictionaryPublisher   5
SELECT r_object_id, object_name
FROM dm_folder
WHERE FOLDER('/Temp/Jobs', descend)
ENABLE (RETURN_RANGE 6 10 5 'object_name')
r_object_id       object_name                  dm_rnum
================  ===========================  =======

0ba447c2800028f1  dm_FTCreateEvents            6
0ba447c280020e1c  dm_FTIndexAgentBoot          7
0ba447c280021901  dm_Initialize_WQ             8
0ba447c28006a624  dm_LogPurge                  9
0ba447c2800001b3  dm_PostUpgradeAction         10
SELECT r_object_id, object_name
FROM dm_folder
WHERE FOLDER('/Temp/Jobs', descend)
ENABLE (RETURN_RANGE 11 15 5 'object_name')
r_object_id       object_name                  dm_rnum
================  ===========================  =======

0ba447c280043c5e  dm_QmPriorityAging           11
0ba447c280043cdf  dm_QmPriorityNotification    12
0ba447c280043c57  dm_QmThresholdNotification   13
0ba447c280002680  dm_StateOfDocbase            14
0ba447c28000263f  dm_UpdateStats               15
SELECT r_object_id, object_name
FROM dm_folder
WHERE FOLDER('/Temp/Jobs', descend)
ENABLE (RETURN_RANGE 16 20 5 'object_name')
r_object_id       object_name                  dm_rnum
================  ===========================  =======

0ba447c280043cda  dm_WFReporting               16
0ba447c280043c5a  dm_WFSuspendTimer            17
0ba447c28002fb95  dm_WfmsTimer                 18
0ba447c280021d01  dm_bpm_XCPAutoTaskMgmt       19
0ba447c280026583  dm_usageReport               20


Examples-icon.png Astuces

Même si cela n'est pas spécifié dans la clause SELECT, la requête retourne la colonne dm_rnum correspondant au numéros de la ligne, mais sur l'ensemble des résultats, pas dans le sous ensemble sélectionné.


Au cas où les les bornes dépassent le nombre de résultats de la requête, aucune ligne n'est retournée sans entraîner d'erreur. Ceci permet d'identifier la fin d'une pagination.

SELECT r_object_id, object_name
FROM dm_folder
WHERE FOLDER('/Temp/Jobs', descend)
ENABLE (RETURN_RANGE 21 25 5 'object_name')
r_object_id       object_name                  dm_rnum
================  ===========================  =======


Warning-icon.png Non fonctionnel

Dans le cas d'une utilisation, il était souhaité de pouvoir effectuer une pagination et de trier sur la valeur en majuscule d'un attribut. Cependant, il est impossible d'utiliser une fonction dans le critère de tri de RETURN_RANGE.

Le premier essai était de mettre l'intitulé de la fonction dans la clause de tri.

SELECT r_object_id, object_name, UPPER(object_name)
FROM dm_folder
WHERE FOLDER('/Temp/Jobs', descend)
ENABLE (RETURN_RANGE 16 20 5 'UPPER(object_name)')

Mais l'erreur suivante est affichée.

[DM_QUERY2_E_UNRECOGNIZED_HINT]error:  "RETURN_RANGE is an unknown hint or is being used incorrectly."
[DM_QUERY_E_INVALID_CHARS_IN_SQLHINT]error:  "Unexpected character(s) found in the hint. This could be a malformed query or a deliberate attempt for
injecting SQL. User: dmadmin client: item-88872.dhcp.manh.fr.sopra query: SELECT r_object_id, object_name, UPPER(object_name)
FROM dm_folder
WHERE FOLDER('/Temp/Jobs', descend)
ENABLE (RETURN_RANGE 16 20 5 'UPPER(object_name)') "


Il a été testé de mettre un alias sur la colonne mise en majuscule, mais sans succès.

SELECT r_object_id, object_name, UPPER(object_name) as uppername
FROM dm_folder
WHERE FOLDER('/Temp/Jobs', descend)
ENABLE (RETURN_RANGE 16 20 5 'uppername')

Le message d'erreur est alors le suivant.

[DM_QUERY_E_CURSOR_ERROR]error:  "A database error has occurred during the creation of a cursor ('ORA-00904: "DM_FOLDER"."UPPERNAME": invalid identifier')."