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 :
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. |
Le numéro avec lequel on accède au données de la base peut retourner plus de 2000 références.
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
WHERE CONTAINS(:W-TYPE, TYPE)
Merci d'avance pour votre réponse et n'hésitez pas si vous voyez d'autres solutions.
Partager