IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces de programmation Oracle Discussion :

[PRO*C] Allocation dynamique


Sujet :

Interfaces de programmation Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Par défaut [PRO*C] Allocation dynamique
    bonjour, bon ben voila on m'a imposé pro*C.
    j'ai un problème que je ne comprends pas.
    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXEC SQL BEGIN DECLARE SECTION;
    	float valeur[66];
    EXEC SQL END DECLARE SECTION;
    Puis dans le main après avoir rempli mon tableau de float avec une requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(i=0; i<nbr_66; i++)
    {
    	printf("valeur :%f \n", valeur[i]);
    }
    J'ai bien les résultats de ma table, super...
    le problème c'est que je dois connaitre la taille de mon tableau à l'avance.
    J'ai donc essayé de faire un truc mais ca ne marche pas du tout.

    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
     
     
    int main()
    {
     int i=0;
     
     size_t nbr_donnees=0; //nombres de lignes récupérées lors de la requete
     
    //connexion à la bdd que je ne mets pas pour alléger
     
    EXEC SQL OPEN compte;
    EXEC SQL FETCH compte
    INTO :nbr_donnees;
    EXEC SQL CLOSE compte;
     
    //nbr_donnes prend la valeur 66 cela marche donc bien !
     
     
    //allocation dynamique du tableau de float
    float *derniere_valeur = malloc (sizeof (float) * nbr_donnees);
     
    EXEC SQL OPEN tout_station;
    EXEC SQL FETCH tout_station
    INTO :derniere_valeur;
    EXEC SQL CLOSE tout_station;
     
    for(i=0; i<nbr_donnees; i++)
    {
    	printf("valeur :%f \n", valeur[i]);
    }
    Et là ca m'affiche n'importe quoi.... je ne comprends pas d'où cela vient.
    Quelqu'un peut -il m'aider ?

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    salut,

    Peux tu poster le code SQL des curseurs ?
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Par défaut
    Bonsoir, est-ce vraiment très important ?
    Car c'est une requete select avec pas mal de conditions.
    La requete marche sous sql.
    Le problème ne vient pas du fait que mon tableau a en paramètre une variable qui n'est pas une constante ?
    Je posterai les codes des curseurs demain car je ne les ai pas sous la main.

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Quant tu déclares explicitement un array de float, pro*c détecte ton tableau et fait alors un bulk fetch.

    Quant tu déclares un pointeur, alors, pro*c ne détecte plus de tableau et donc, dans ce cas, il faut fetcher ligne à ligne dans une variable que tu affectes, à chaque fetch, à une entrée de ton array..
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Par défaut
    haaaaaaaaaaaaaaaaaa d'accord, je comprends mieux, je posterai demain tout le code. merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 60
    Par défaut
    Bonjour, je mets le code complet.

    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
     
    EXEC SQL BEGIN DECLARE SECTION;
    /*******************************************
    *Déclaration d'un curseur permettant de connaitre
    *le nombre de lignes
    *******************************************/
    EXEC SQL DECLARE compte CURSOR FOR
    select count(*)
    from station, mesure, supervision
    where station.flag_valid = 1
    and station.d_arret > Sysdate
    and mesure.d_arret > Sysdate
    and mesure.cmhs = 1
    and station.nom_court_sit = mesure.nom_court_sit
    and supervision.tagname = ltrim(to_char(station.nsit, '00000'))||'.M'||ltrim(to_char(mesure.no_dans_sit,'000'))||'.P2';
     
     
    /*******************************************
    *Déclaration d'un curseur contenant notre requête
    *
    *******************************************/
    EXEC SQL DECLARE tout_station CURSOR FOR
    select station.nom_court_sit, mesure.nom_mes, supervision.value
    from station, mesure, supervision
    where station.flag_valid = 1
    and station.d_arret > Sysdate
    and mesure.d_arret > Sysdate
    and mesure.cmhs = 1
    and station.nom_court_sit = mesure.nom_court_sit
    and supervision.tagname = ltrim(to_char(station.nsit, '00000'))||'.M'||ltrim(to_char(mesure.no_dans_sit,'000'))||'.P2';
     
    /*-----------------------------------------------------------------------*/
    EXEC SQL END DECLARE SECTION; 
     
    EXEC ORACLE OPTION (RELEASE_CURSOR=YES);
     
    EXEC ORACLE OPTION(ORACA=YES);
    Je sélectionne 3 colonnes de trois tables différentes.
    Donc j'ai trois tableaux. (dans l'exemple précédent j'en avais mis qu'un pour simplifier car c'est le même problème pour les trois).
    Le code dans le main

    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
     
     
    int main()
    {
     int i=0;
     
     size_t nbr_donnees=0; //nombres de lignes récupérées lors de la requete
     int connexion;
     
    /*-------------------------------------------
    	    Connexion a la base                  
    -------------------------------------------*/
     
    	connexion = connectora();
    	if (connexion != 0)
    	{
    	exit(4);
    	}
     
    /************************************************
    * Exécution du premier curseur permettant de connaitre
    * le nombre de résultats de la requete
    *************************************************/
     
    EXEC SQL OPEN compte;
    EXEC SQL FETCH compte
    INTO :nbr_donnees;
    EXEC SQL CLOSE compte;
     
     
    //tableau qui récupère le supervision.value de la requete
     
    float *derniere_valeur = malloc (sizeof (float) * nbr_donnees);
     if (derniere_valeur == NULL)//On vérifie que l allocation mémoire n échoue pas
        {
            fprintf(stderr, "L'allocation mémoire a échoué");
            exit(EXIT_FAILURE);
        }
     
     
    //tableau qui récupère le station.nom_court_sit de la requete
     
    int*num_site= malloc (sizeof (int) * nbr_donnees);
     if (derniere_valeur == NULL)//On vérifie que l allocation mémoire n échoue pas
        {
            fprintf(stderr, "L'allocation mémoire a échoué");
            exit(EXIT_FAILURE);
        }
     
     
    //tableau qui récupère le mesure.nom_mes de la requete
     
    int*mesure= malloc (sizeof (int) * nbr_donnees);
     if (derniere_valeur == NULL)//On vérifie que l'allocation mémoire n'échoue pas
        {
            fprintf(stderr, "L'allocation mémoire a échoué");
            exit(EXIT_FAILURE);
        }
     
     
    //C est la qu il faut faire ce dont vous m avez parlé hier :
     
    EXEC SQL OPEN tout_station;
    EXEC SQL FETCH tout_station
    INTO :num_site, :mesure, :derniere_valeur;
    EXEC SQL CLOSE tout_station;
    Voila

  7. #7
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    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
    /* ... */
     
    int i = 0;
     
    /* ... */
     
     
        EXEC SQL WHENEVER NOT FOUND do break;
     
        EXEC SQL OPEN tout_station;
     
        while(1)
        {
            EXEC SQL FETCH tout_station
            INTO :num_site[i], :mesure[i], :derniere_valeur[i];
     
            i++;
        }
     
        EXEC SQL CLOSE tout_station;
     
        EXEC SQL WHENEVER NOT FOUND CONTINUE;
     
     
    /* ... */
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PRO*C] Allocation dynamique d'un tableau de VARCHAR
    Par NéalZheimer dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 07/07/2006, 13h02
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo