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 :
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
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
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 DECLARE curseur1 SQLCODE DECLARE = 0 OPEN curseur1
Displays :
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
Environnement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 DECLARE curseur1 SQLCODE DECLARE = 0 OPEN curseur1 SQLCODE OPEN = 0
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
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) ?
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'))
Piste : avec un contenu inférieur (test sur 20 000) : traitement OK
Merci d'avance pour votre aide.
Partager