Bonjour,
Dans le cadre de l'optimisation de nos traitements, je m'occupe d'un accesseur cobol à une table DB2 sous ZOS.
La requète sql est assez basique :
Le numéro avec lequel on accède au données de la base peut retourner plus de 2000 références.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 EXEC SQL DECLARE CURSEUR CURSOR FOR SELECT REFERENCE, NUMERO, ... FROM TABLE_REF WHERE PART = :W-IN-PART AND NUMERO = :W-IN-NUMERO AND SIRET BETWEEN :W-IN-SIRET-INF AND :W-IN-SIRET-SUP ... FOR FETCH ONLY OPTIMIZE FOR 20 ROWS END-EXEC.
L'utilisateur renseigne donc un type en entrée pour cibler les références voulues.
Le type pouvant prendre plusieurs valeurs, le programme en entrée reçoit ainsi une table avec toutes les valeurs désirées pour le numéro.
Le nombre d'indices valorisés de la table est variable:
Ex: TYPE = 148 (3 valeurs -> 1, 4 et 8)
TYPE = 1235689(7 valeurs -> 1,2,3,5,6,8 et 9)
Ne pouvant pas créer une requète dynamique, la selection de réferences selon les types voulues est effectué en cobol.
Le problème est que pour certains numéros avec énormément de références et trés peu correspondant aux types en entrée, le nombre d'ordre db2 devient vite trés élevé!(on fetch jusqu'à obtenir les bons candidats).
J'aimerai donc ne plus gérer le TYPE au niveau Cobol mais en SQL pour diminuer le nombre de fetchs.
Savez vous s'il y a l'équivalent en db2 de la fonction contains?
Ainsi je placerai le prédicat suivant dans ma requète
Merci d'avance pour votre réponse et n'hésitez pas si vous voyez d'autres solutions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part WHERE CONTAINS(:W-TYPE, TYPE)
Partager