Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3123 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  aide SQL/PRO*C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

aide SQL/PRO*C

n°1194987
alxtaz
Posté le 08-09-2005 à 14:09:46  profilanswer
 

bonjour,
j'utilise le Pro*c sur un systeme VMS.
Je mets en dessous le code d'une fonction que j'utilise, pour faire la lecture sur une table. Cela fonctionne, mais il arrive que cette fonction utilisée plusieurs fois dans le meme programme, genere un "access violation" (pas a tous les coups).
j'aimerais savoir si vous voyez quelque chose de bizare dans ma facon de faire ??
 
 
 
mon code :
__________
/* structure de ma table */
typedef struct
{
 char champ1[5];
 int champ2;
 char champ3;
} matable_occ;
 
/* structure de l'indicator de ma table */
typedef struct
{
 short champ1;
 short champ2;
 short champ3;
} matable_ind;
 
/* structure utile */
typedef struct
{
 matable_occ occ;
 matable_ind ind;
} matable;
 
 
 
 
/* cette fonction permet de faire une lecture de la table matable avec une clause where qui est passée en parametre */
/* le deuxième parametre est un tableau d'enregistrements de matable, correspondant a la requete */
/*renvoie le nombre d'enregistrement lus*/
int lec_matable(char *clause_where,matable **tab)
{
  EXEC SQL BEGIN DECLARE SECTION;
     char requete[500];
     int nb_enr;
     matable_occ curocc_occ;
     matable_ind curocc_ind;
     matable *occs;
  EXEC SQL END DECLARE SECTION;
 
 
  int i;
  int err=0;
     
 
  EXEC SQL WHENEVER SQLERROR DO err=sql_error(strcat(MODULE,"lec_matable Erreur oracle : " ));
 
 /* recupere le nombre d'enregistrement a lire */
  strcpy(requete,"SELECT COUNT(1) FROM matable " );
  strcat(requete,clause_where);
  EXEC SQL PREPARE S1 FROM :requete;
  EXEC SQL DECLARE C1 CURSOR FOR S1;
  EXEC SQL OPEN C1;
  if (err<0)
   return -1;
  EXEC SQL FETCH C1 INTO :nb_enr;
  EXEC SQL CLOSE C1;
  if (err<0)
  {
     return -1;
  }
     
 
  if (nb_enr==0)
    return 0;
 
 /* allocation en memoire du tableau d'enregistrement reponse */
  occs = (matable *)calloc(nb_enr,sizeof(matable));
 
 /* recupere les enregistrements */
  strcpy(requete,"SELECT champ1,champ2,champ3 FROM matable " );
  strcat(requete,clause_where);
  EXEC SQL PREPARE S1 FROM :requete;
  EXEC SQL DECLARE C2 CURSOR FOR S1;
  EXEC SQL OPEN C2;
  if (err<0)
   return -1;  
  EXEC SQL WHENEVER NOT FOUND DO break;
  for (i=0;;i++)
  {
    EXEC SQL FETCH C2 INTO :curocc_occ INDICATOR :curocc_ind;
    if (err<0)
    {
   EXEC SQL CLOSE C2;
     return -1;
    }
 /*recopie l'enregistrement fetché */    
    occs[i] = matable_assign(curocc_occ,curocc_ind);
  }
  *tab = occs;
 
 
 
 
  EXEC SQL CLOSE C2;
  if (err>=0)
  {
   return nb_enr;
  }
  else
 return -1;
     
}
 
 
 
 
Est ce que quelque chose vous parait choquant la dedans, un oubli, une mauvaise façon d'opérer, .... ????
Voila le compte rendu d'erreur de VMS.
 
 
 
le compte rendu d'erreur de VMS :
_________________________________
 
 
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=0000000036005553, PC=00000000002508CC, PS=0000001B
%TRACE-F-TRACEBACK, symbolic stack dump follows
  image    module    routine             line      rel PC           abs PC
 LIBCLNTSH  SQLEXP  sqldbid            245574 000000000000165C 00000000002508CC
 LIBCLNTSH  SQLEXP  sqlexp             246441 00000000000047D4 0000000000253A44
 LIBCLNTSH  SQLENT  sqlcmex            243418 0000000000000534 0000000000246124
 LIBCLNTSH  SQLENT  sqlcxt             243713 0000000000000C54 0000000000246844
 LANCEUR_RAU  SQL_LEC_MATABLE  lec_matable                         26408 00000000000001A4 000000000004B4D4
 LANCEUR_RAU  LANCEUR_RAU  main         34617 00000000000000E4 00000000000300E4
 LANCEUR_RAU  LANCEUR_RAU  __main           0 0000000000000064 0000000000030064
 PTHREAD$RTL                                0 0000000000055D58 000000007BD37D58
 PTHREAD$RTL                                0 0000000000030404 000000007BD12404
                                            0 FFFFFFFF80269ED4 FFFFFFFF80269ED4
 
 
 
Merci d'avance pour votre aide.
 
 
 

mood
Publicité
Posté le 08-09-2005 à 14:09:46  profilanswer
 

n°1195017
moi23372
Posté le 08-09-2005 à 14:19:04  profilanswer
 

je suppose que c'est un problème d'accès concurent! Tu es bien sure que le niveau d'isolation n'est pas trop haut?
Quel base utilise tu? du moins quelle version...

n°1195036
alxtaz
Posté le 08-09-2005 à 14:27:44  profilanswer
 

Je ne sais pas ce que signifie le "niveau d'isolation", je ne suis pas administrateur de la base.
C'est une base Oracle 9.2.0.5.

n°1195356
alxtaz
Posté le 08-09-2005 à 18:13:15  profilanswer
 

sinon, qu'est ce qui te fait dire que ce serait un probleme d'acces concurents???
Est ce qu'un niveau d'isolation trop élevé pourrait faire un "dump" ou bien aboutirait il a une erreur gérée???

n°1195367
moi23372
Posté le 08-09-2005 à 18:24:59  profilanswer
 

d'après ce que je sais sur les bases de données Oracle!  
Le seul niveau d'isolation capable de déclencher une erreur c'est le niveau le plus haut, c'est à dire le niveau SERIALIZABLE!  
Mais ce niveau est très peu utilisé. Donc ça me semble bizzare comme erreur.
 
Pour bien faire, il faudrait avoir le numéro d'erreur oracle exacte pour savoir à quoi s'en tenir, donc si tu savais nous le donner!
Sinon ça pourrait également venir d'un problème avec les droits d'accès à la base! Or ici tu me dis bien que ça marche de temps en temps, donc c'est peut être un problème propre à Oracle...
Est-ce que ce problème se produit dans un cas particulier, ou est-ce aléatoire?

n°1195385
olivthill
Posté le 08-09-2005 à 18:33:33  profilanswer
 

Edit :
J'ai eu un doute sur le sizeof de la ligne

 occs = (matable *)calloc(nb_enr,sizeof(matable));

mais, j'ai vérifié et sizeof renvoie bien la longueur de la structure.
Par ailleurs, il serait souhaitable de tester si calloc ne renvoie pas null et de libérer l'espace alloué à la fin. Il faudrait aussi s'assurer que champ1, champ2, champ3 ont la bonne taille.


Message édité par olivthill le 08-09-2005 à 20:12:41
n°1204129
alxtaz
Posté le 21-09-2005 à 11:30:06  profilanswer
 

désolé pour le retard de ma réponse mais j'étais passé à autre chose, j'ai donc toujours mon problème.
A priori ça ne vient pas du calloc, parceque g essayé avec un tableau de taille fixe, ça fait la même chose.
L'espace alloué, je le libère à l'extèrieur de la fonction. J'ai vérifié tous les champs au moins 20 fois, je vois rien.
 
En fait, ce problème se produit, apparement, au bout d'un certain nombre d'appelle à cette fonction.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  aide SQL/PRO*C

 

Sujets relatifs
Besoin aide pour acceder à StarTeam via command line[aide] popup image javascript ?!
aide pour redimensionnement automatique.[SQL Server] Procédure stockée trop longue
[BESOIN D'AIDE] phpmyadmin, données et jeux de caractères...demande petite aide pour newbi du C :)
[ASM]besoin d'aideA l'aide sur VBA
Appel d'un script SQL dans un script SQL[SQL] probleme insert basic avec sequences
Plus de sujets relatifs à : aide SQL/PRO*C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR