PRO*C.
Oracle 10g.
SunOS 5.8.

Bonjour,

Tout d'abord, merci à vous pour le temps que vous aurez passé à lire mon post.

Je souhaiterais savoir quelle était la fonction et/ou la syntaxe pour pouvoir comparer un varchar avec un autre varchar. Je m'explique, j'ai stocké le résultat d'une requête dans un curseur puis je le FETCH. Il s'avère que les champs de mon curseur sont déclarés en varchar, puis je souhaite comparer le premier champ avec un varchar temporaire.

Voici mon code :
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
 
/*******************************************************************************/
#include <stdio.h>
#include <errno.h>
#include <string.h>
 
/********************* kit Proc *********************************************/ 
#include "utl_logapi.h"
#include "ord_ordapi.h"
#include "udb_dbapi.h"
 
/********************* Include applicatifs************************************/ 
#include "tel_cst.h"
 
/********************* Declaration des variables   ***************************/ 
static FILE *requete;
 
extern char *tel_reception;
 
init ( ) 
{
 
	EXEC SQL DECLARE  cur_requete CURSOR FOR
	SELECT 	ID,
		MonChamp,
		Compteur, 
		sum(Valeur)
	FROM 	MaTable
	GROUP BY ID, MonChamp, Compteur
	ORDER BY ID
	;
 
}
 
run ( ) 
{
/***************** declaration des variables hotes  ******************************/	
 
char buff[255];
 
	EXEC SQL BEGIN DECLARE SECTION ; 
 
	        /***   requete boucle ************/
 
		char  CreateQuery[2000];
 
		/** Variables de travail **/
		varchar ID_en_cours [10];
 
		varchar req_ID [10];
		varchar req_MonChamp [4];
		varchar req_Compteur [6];
		int req_valeur=0;
 
/*		short ind_ID_en_cours;*/
		short ind_req_ID;
		short ind_req_MonChamp;
		short ind_req_Compteur;
 
/* Les compteurs de sortie */		
 
int C1_out=0;        /* Compteur de sortie n°1 */
 
int C2_out=0;        /* Compteur de sortie n°2 */
 
int C3_out=0;        /* Compteur de sortie n°3 */
 
int C4_out=0;        /* Compteur de sortie n°4 */
 
 
/* Les 3 valeurs possibles pour MonChamp */
 
varchar MonChamp01 [4];
varchar MonChamp02 [4];
varchar MonChamp03 [4];
 
EXEC SQL END DECLARE SECTION ;
 
/* Implementation des 3 valeurs souhaitees dans MonChamp */
EXEC SQL SELECT '4011'
		INTO :MonChamp01
		FROM DUAL;
 
EXEC SQL SELECT '4010'
		INTO :MonChamp02
		FROM DUAL;
 
EXEC SQL SELECT '4012'
		INTO :MonChamp03
		FROM DUAL;
 
/* Initialisation de l'ID */
EXEC SQL SELECT '0'
INTO :ID_en_cours
FROM DUAL;
 
/* Implementation des compteurs d'entree */
 
		varchar C1_in [6];
		EXEC SQL SELECT 'AAAA'
		INTO :C1_in
		FROM DUAL;
 
		varchar C2_in [6];
		EXEC SQL SELECT 'ABABAB'
		INTO :C2_in
		FROM DUAL;
 
		varchar C3_in [6];
		EXEC SQL SELECT 'BBBBB'
		INTO :C3_in
		FROM DUAL;
 
		varchar C4_in [6];
		EXEC SQL SELECT 'BBBBBA'
		INTO :C4_in
		FROM DUAL;
 
		varchar C5_in [6];
		EXEC SQL SELECT 'ABBBBB'
		INTO :C5_in
		FROM DUAL;
 
/***************** Ouverture du curseur requete  ******************************/
 
		/**** requete de creation de vue ********/ 
 
		sprintf(CreateQuery, "CREATE OR REPLACE VIEW A.MA_VUE(ID, MONCHAMP, COMPTEUR, VALEUR) AS SELECT ID, MONCHAMP, COMPTEUR, SUM(VALEUR) FROM (SELECT * FROM MATABLE WHERE MonChamp IN (C1_in.arr,C2_in.arr,C3_in.arr,C4_in.arr,C5_in.arr)");
		EXEC SQL PREPARE q FROM :CreateQuery;
		EXEC SQL EXECUTE q;
 
	REQ: 
		sprintf(buff,"%s/%s.%s.dat",tel_reception,REQUETE_NF,req_DAT_FIC_INV.arr);
		requete = fopen( buff, "w" ) ; 
		fprintf ( requete, "ID	C1_out	C2_out	C3_out	C4_out\n");
 
		EXEC SQL OPEN cur_requete ;
 
		for ( ; udb_is_ok ( ) ; )
		{
			EXEC SQL FETCH cur_requete
			INTO    :req_id,
					:req_monchamp:ind_req_monchamp,
					:req_compteur:ind_req_compteur,
					:req_valeur;
 
			/**** formatage des variables hotes ********/ 
 
			req_id.arr[req_id.len]='\0';
			req_monchamp.arr[req_monchamp.len]='\0';
			req_compteur.arr[req_compteur.len]='\0'; 
 
			/** Premiere lecture **/
			/* On implemente la valeur de l'id lue a l'id en cours */			
			id_en_cours.arr[0] = req_id.arr[0];
			id_en_cours.arr[1] = req_id.arr[1];
			id_en_cours.arr[2] = req_id.arr[2];
			id_en_cours.arr[3] = req_id.arr[3];
			id_en_cours.arr[4] = req_id.arr[4];
			id_en_cours.arr[5] = req_id.arr[5];
			id_en_cours.arr[6] = req_id.arr[6];
			id_en_cours.arr[7] = req_id.arr[7];
			id_en_cours.arr[8] = req_id.arr[8];
			id_en_cours.arr[9] = req_id.arr[9];
 
			/* On initialise les compteurs de sortie */
			C1_out=0;
			C2_out=0;
			C3_out=0;
			C4_out=0;
 
			/* On verifie juste les valeurs de l'id lue et de l'id en cours */
			fprintf ( stdout , "id lue : %s, id en cours : %s\n",req_id.arr,id_en_cours.arr);
 
			/* Tant que l'id lue est egal a l'id en cours, on incremente les compteurs de sorties avec les compteurs d'entree */
			while (req_id.arr == id_en_cours.arr)
			{
				/* Incrementation des compteurs */
 
				if (req_compteur.arr == C1_in.arr)
				{ 
				C2_out=C2_out+req_valeur;
				C3_out=C3_out+req_valeur;
				C4_out=C4_out+req_valeur;
				}
 
				if (req_compteur.arr == C2_in.arr)
				{
				C1_out=C1_out+req_valeur;
				C4_out=C4_out+req_valeur;
				}
 
				if (req_compteur.arr == C3_in.arr)
				{
					if ( req_monchamp.arr == monchamp01.arr )
					{
					C1_out=C1_out+req_valeur;
					}
					if ( req_monchamp.arr == monchamp02.arr )
					{
					C2_out=C2_out+req_valeur;
					}
				}
 
				if (req_compteur.arr == C4_in.arr)
				{
					if ( req_monchamp.arr == monchamp03.arr )
					{
					C3_out=C3_out+req_valeur;
					}
					if ( req_monchamp.arr == monchamp01.arr )
					{
					C2_out=C2_out+req_valeur;
					}
				}
 
				if (req_compteur.arr == C5_in.arr)
				{
				C1_out=C1_out+req_valeur;
				C3_out=C3_out+req_valeur;
				}
			}
 
			/* On change d'id : l'id lue est celui d'apres dans la vue */
 
			if (req_id.arr != id_en_cours.arr)	
			{
			/**** On ecrit dans le fichier ****/
			fprintf ( requete, "%s	%d	%d	%d	%d\n",
			id_en_cours.arr,
			C1_out,
			C2_out,
			C3_out,
			C4_out);
 
			/* on reinitialise les compteurs de sortie */
			C1_out=0;
			C2_out=0;
			C3_out=0;
			C4_out=0;
 
			/* On passe donc a l'id suivant */
			id_en_cours.arr[0] = req_id.arr[0];
			id_en_cours.arr[1] = req_id.arr[1];
			id_en_cours.arr[2] = req_id.arr[2];
			id_en_cours.arr[3] = req_id.arr[3];
			id_en_cours.arr[4] = req_id.arr[4];
			id_en_cours.arr[5] = req_id.arr[5];
			id_en_cours.arr[6] = req_id.arr[6];
			id_en_cours.arr[7] = req_id.arr[7];
			id_en_cours.arr[8] = req_id.arr[8];
			id_en_cours.arr[9] = req_id.arr[9];			
			}
		}
}
Voici ce qu'il est censé faire : écrire un fichier contenant 1 ligne par identifiant (ID) avec en colonne les valeurs de Cn_out qui sont les compteurs de sortie qui sont calculés à partir de la somme des différents compteurs d'entrée (Cn_in).

Exemple de fichier de sortie théorique :
ID C1_out C2_out C3_out C4_out
A1 10 105 208 82
B2 99 85 20005 2
C3 58 979 4040 1

Or voici le fichier que j'obtiens :
ID C1_out C2_out C3_out C4_out
A1 0 0 0 0
A1 0 0 0 0
A1 0 0 0 0
B2 0 0 0 0
B2 0 0 0 0
B2 0 0 0 0
B2 0 0 0 0
B2 0 0 0 0
C3 0 0 0 0
C3 0 0 0 0

Je pense avoir plusieurs problèmes dans mon code :
1°) le FETCH ne parcours pas ligne à ligne le résultat de ma requête mais inscrit tout le résultat dans une table,
2°) il y a un problème dans la comparaison des différents varchar, la syntaxe pour comparer 2 valeurs de varchar en PRO*C ne doit pas être celle que j'ai écrite.

Merci d'avance pour votre aide. N'hésitez pas si je ne suis pas assez clair.