C/Proc*C et taille maximum d'un tableau

C/Proc*C et taille maximum d'un tableau - C - Programmation

Marsh Posté le 09-05-2005 à 11:34:07    

Bonjour,  
 
j'ai quelques soucis sur un tableau en ProC
J'ai repris pour maintenance un programme ancien pour redimensionner un tableau.
Le prog déclare un curseur sur une table et fait un fetch dans le tableau de long.
La volumétrie de la table augmentant, j'ai voulu passer la taille du tableau de 60000 à 80000.
 
Et là, le contenu du tableau est complètement farfelu.
Je soupçonne un dépassement de capacité ou une saleté du genre...
 
La taille d'un tableau est-elle limitée ( à 2 puissance 16 éléments, par exemple ?)
Comment contourner le pb (autrement qu'en me débrouillant pour faire le fetch dans deux tableaux) ?
 
merci d'avance
 
Steph

Reply

Marsh Posté le 09-05-2005 à 11:34:07   

Reply

Marsh Posté le 09-05-2005 à 13:52:30    

Ton tableau ne rentre peut-être pas entièrement dans la pile.
 
Essayes d'utiliser un pointeur en faisant un malloc pour voir si ça marche mieux.

Reply

Marsh Posté le 10-05-2005 à 11:06:37    

bon, en fait j'ai fait un test tout bête (remplissage d'un tableau sans utiliser le "fetch" ) et ça fonctionne.
Le pb vient donc d'une limitation du "fetch"
quelqu'un a-t-il une idée ?

Reply

Marsh Posté le 10-05-2005 à 11:08:36    

montre le code, c'est quoi le "fetch" ?

Reply

Marsh Posté le 10-05-2005 à 11:12:08    

long ORA_AA794DWID[80000] ;
....
 
EXEC SQL DECLARE C3 CURSOR FOR
       SELECT AA794DWID
       FROM
   AA794_TPMMK ;
 
    EXEC SQL OPEN C3;
 
 
    for (;;)
        {
     
           EXEC SQL FETCH C3  INTO :ORA_AA794DWID;
        }

Reply

Marsh Posté le 10-05-2005 à 23:22:29    

Citation :

for (;;)
        {  
     
           EXEC SQL FETCH C3  INTO :ORA_AA794DWID;  
        }



 
ORA_AA794DWID n'est qu'un buffer, rien ne garanti qu'il contienne bien le résultat de la requête après la boucle.
Le traitement du tableau doit donc se faire dans la boucle juste après le fetch.
 
Et utilise sqlca.sqlerrd[2] pour savoir combien de réponses tu as reçues depuis que tu as ouvert ton curseur.
 
Regarde ici, il y a des exemples :
http://etna.int-evry.fr/COURS/BD/DOC_ORACLE/pro*c.html


Message édité par Tarabiscote le 10-05-2005 à 23:24:17
Reply

Marsh Posté le 11-05-2005 à 09:26:55    

j'utilisais sqlca.sqlerrd[2] et il renvoyait bien la valeur attendue.
Ce que je n'avais pas saisi, c'est que plusieurs fetch se succédaient (suis je bête : il y a un for) et que mon tableau était donc écrasé.
 
Solution : effectivement dans le for, appel d'une procédure qui ajoute le contenu de mon tableau à un tableau global.
 
 
Merci de vos réponses
Steph

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed