Bonjour,
Je souhaite récupérer des données de la base avant d'en insérer d'autres. Comme je manipule de très grosses masses de données, je dois procéder par blocs dont la taille n'est pas fixée à la compilation.
Je n'ai pas de problème avec les types scalaires (int...) mais pour VARCHAR, je dois dire que je bloque.
Voici du code qui ne passe pas mais qui donne, je pense une bonne idée de ce que je veux faire :
En fait le problème vient du fait que VARCHAR n'est pas simplement un tableau de caractères comme en C classique, le précompilateur Pro*C créé une structure.
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 int i; /* Compteur */ EXEC SQL BEGIN DECLARE SECTION; int bloc; /* Taille d'un bloc */ int* tNum; /*Numeros des gens */ VARCHAR** tNom; /* Noms des gens */ EXEC SQL END DECLARE SECTION; bloc = 100; /* Recupere dynamiquement (parametrable) */ tNum = (int*) malloc(bloc * sizeof(*tNum)); /* Le probleme est juste la... */ tNom = (VARCHAR**) malloc(bloc * sizeof(*tNom)); for(i = 0; i < bloc; i++) { tNom[i] = (VARCHAR*) malloc(20 * sizeof(**tNom)); /* 20 : Taille d'un nom */ } EXEC SQL DECLARE c_gens CURSOR FOR SELECT num, nom FROM gens; /* Gestion des erreurs */ EXEC SQL OPEN c_gens; /* Gestion des erreurs */ EXEC SQL FOR :bloc FETCH c_gens INTO :tNum, :tNom; /* Gestion des erreurs */ while(/* encore des lignes, je sais faire mais le probleme n'est pas la */) { /* Traitements sur tNum et tNom */ EXEC SQL FOR :bloc INSERT INTO client(num, nom) VALUES (:tNum, :tNom); EXEC SQL FOR :bloc FETCH c_gens INTO :tNum, :tNom; /* Gestion des erreurs */ } free(tNum); for(i = 0; i < bloc; i++) { free(tNom[i]); } free(tNom);
La question est : peut-on faire une allocation dynamique d'un tableau de VARCHAR pour l'utilisation de Host Array ?
Merci par avance !
Edit : Pro*C/C++: Release 9.2.0.4.0
Partager