Bonjour à tous.

Je rencontre un souci lors d'un traitement cobol faisant des requêtes SQL de lecture via un curseur.

Le bloc SQL à problème me permet de me repositionner dans ma lecture. Il utilise les host variables W-CLE-POS-PRIM et W-CLE-POS-SEC qui représentent mes clés de repositionnement primaire et secondaire.

Voici mon curseur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
EXEC SQL                                                  
DECLARE CURSEUR1 CURSOR FOR                           
    SELECT DISTINCT A.ID_1, A.ID_2,                           
    FROM Table1 A , Table2 B                            
    WHERE A.ID_2                =  B.ID_2                
      AND B.ID_2                <> :W-CTE-ID-ZERO     (vaut 00000000000000000)               
      AND B.DT_CREA BETWEEN :W-DT-CREA-1 AND :W-DT-CREA-2           
      AND B.ETAT                 = :W-ETAT                              
      AND ((A.ID_2               = :W-CLE-POS-SEC     (vaut 00000000000000000)       
        AND A.ID_1               > :W-CLE-POS-PRIM)   (vaut 00000000000000000)
        OR (A.ID_2               > :W-CLE-POS-SEC))
    ORDER BY A.ID_2,A.ID_1                     
END-EXEC
Mon traitement reste bloquer sur l'open du curseur à en croire les displays :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
DECLARE curseur1
SQLCODE DECLARE = 0
OPEN curseur1
Cependant en forçant en dur la valeur (et uniquement celle là), le traitement se débloque :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
EXEC SQL                                                  
  DECLARE CURSEUR1 CURSOR FOR                           
    SELECT DISTINCT A.ID_1, A.ID_2,                           
    FROM Table1 A , Table2 B                            
    WHERE A.ID_2                =  B.ID_2                
      AND B.ID_2                <> :W-CTE-ID-ZERO     (vaut 00000000000000000)               
      AND B.DT_CREA BETWEEN :W-DT-CREA-1 AND :W-DT-CREA-2           
      AND B.ETAT                 = :W-ETAT                              
      AND ((A.ID_2               = :W-CLE-POS-SEC     (vaut 00000000000000000)       
        AND A.ID_1               > :W-CLE-POS-PRIM)   (vaut 00000000000000000)
        OR (A.ID_2               > '00000000000000000'))
    ORDER BY A.ID_2,A.ID_1                      
END-EXEC
Displays :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
DECLARE curseur1
SQLCODE DECLARE = 0
OPEN curseur1
SQLCODE OPEN = 0
Environnement :
DB2 v8
Cobol v3.2
Contenu de la table : > 1 000 000

Ce que j'ai déjà tenté :
1- essayer des valeurs en dur sur les autres champs : ne change rien
2- utiliser des host variables différentes (au lieu de W-CLE-POS-SEC) : ne change rien
3- Vérifier les formats des host variables W-CLE-POS-PRIM et W-CLE-POS-SEC : formats égaux à ceux de la table
4- différentes options de pré-compil et de compil : ne change rien
5- différentes options du BIND REOPT(VARS), REOPT(ALWAYS), REOPT(NONE) : ne change rien
6- Utilisation d'indexes différents : ne change rien
7- Suppression du bloc : traitement ok
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
AND ((A.ID_2               = :W-CLE-POS-SEC     (vaut 00000000000000000)       
        AND A.ID_1         > :W-CLE-POS-PRIM)   (vaut 00000000000000000)
          OR (A.ID_2       > '00000000000000000'))
Ma question : Quelle est la différence de comportement entre une host variable et une valeur en dur ? et pourquoi sur ce champ en particulier (OR ??, et pas sur les autres) ?

Piste : avec un contenu inférieur (test sur 20 000) : traitement OK

Merci d'avance pour votre aide.