Pagination en DQL
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.
Votre avis
Nobody voted on this yet
|
|
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.
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.
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 |
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 ================ =========================== ======= |
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')."