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 :

FETCH d'un nombre de colonnes aléatoire


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Par défaut FETCH d'un nombre de colonnes aléatoire
    Bonjour,

    Tout d'abord merci pour ce Forum sur le Pro*C qui est une véritable mine d'or.

    Ensuite, j'ai besoin de faire un programme qui traite toutes les tables d'une base de données et récupère les noms de colonnes et les clés primaires de chaque table, puis les données de chacune d'entre elles.

    Mon soucis est que lorsque je fais un SELECT * FROM :Table[i], comment faire le FETCH adéquat sachant que le nombre de colonnes de la Table traitée n'est pas connu à l'avance?

    Il me faudrait une méthode applicable au C/PRO*C sans passer par le PL/SQL.

    Merci,

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Par défaut
    J'ai trouvé un truc c'est le ARRAYLEN qui me permet de redimensionner mon tableau pour le traitement de chacune des Tables.

    Celà m'évite ainsi une erreur Oracle, mais malgré celà seule la valeur de la premiere colonne de la table est renvoyée dans le tableau Colonnes, les autres valeurs des autres champs sont nulles, je joins un exemple de 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
    int  i, j, k, CountTable, NbChamps, Sauvegarde_NbTables;
    char Requete[2000], Sauvegarde_Tables[200][50];
    char Champs[100][256], NomChamp[256], Colonnes[100][256];
     
    EXEC SQL WHENEVER SQLERROR DO Erreur("Sauvegarde_Lire_Tables()","Echec de la lecture des tables a copier ...");
    EXEC SQL DECLARE S01 CURSOR FOR
    SELECT DISTINCT(NOMTABLE) FROM SAUVEGARDE_CATEGORIE_TABLE WHERE IDCATEGORIE=:Categorie ORDER BY NOMTABLE;
    EXEC SQL OPEN S01;
     
    Sauvegarde_NbTables=0;
    while(sqlca.sqlcode==0)
    {
      EXEC SQL FETCH S01 INTO :Sauvegarde_Tables[Sauvegarde_NbTables];
      if (sqlca.sqlcode==0)
      {
         Trim2(Sauvegarde_Tables[Sauvegarde_NbTables]);
         Sauvegarde_NbTables++;
      }
    }
    EXEC SQL CLOSE S01;
     
     
    for(i=0; i<Sauvegarde_NbTables; i++)
    {
       printf("Sauvegarde_Lire_Donnees_Communes() -> Traitement 
       Table 's' ...\n", Sauvegarde_Tables[i]);
     
       // Verification que la table existe
       CountTable=0;
       EXEC SQL SELECT COUNT(*) INTO :CountTable FROM USER_TABLES 
       WHERE TABLE_NAME=:Sauvegarde_Tables[i];
       if (CountTable >0)
       {
          // Recuperation des Noms de colonnes de la table
          printf("Sauvegarde_Lire_Donnees_Communes() -> Lecture des colonnes 
          de la table '%s'...\n", Sauvegarde_Tables[i]);
          sprintf(Requete, "SELECT DISTINCT(COLUMN_NAME) FROM 
          USER_TAB_COLUMNS WHERE TABLE_NAME='%s' ORDER BY 
          COLUMN_NAME", Sauvegarde_Tables[i]);
          NbChamps=0;
          EXEC SQL PREPARE Req FROM :Requete;
          EXEC SQL DECLARE S03 CURSOR FOR Req;
          EXEC SQL OPEN S03;
          while(sqlca.sqlcode==0)
          {
             EXEC SQL FETCH S03 INTO :NomChamp;
             if (sqlca.sqlcode==0)
             {
                sprintf(Champs[NbChamps], "%s", Trim(NomChamp));
                printf ("Sauvegarde_Lire_Donnees_Communes() -> Champ trouve 
                '%s'\n", Trim(Champs[NbChamps]));
                NbChamps++;
             }
          }
          EXEC SQL CLOSE S03;
     
          // Recuperation des valeurs des enregistrements de la table
          EXEC SQL ARRAYLEN Colonnes (NbChamps) EXECUTE;
     
          sprintf(Requete, "SELECT * FROM %s", Sauvegarde_Tables[i]);
          EXEC SQL PREPARE Req FROM :Requete;
          EXEC SQL DECLARE S04 CURSOR FOR Req;
          EXEC SQL OPEN S04;
     
          k=0;
          while(sqlca.sqlcode==0)
          {
             EXEC SQL FETCH S04 INTO :Colonnes;
             if (sqlca.sqlcode==0)
             {
                printf ("\n\nLigne N° : %d\n", k);
                k++;
                for (j=0; j<NbChamps; j++)
                {
                   sprintf(ValeurChamp, "%s", Trim(Colonnes[j]));
                   printf ("Colonnes[%d]='%s' ", j, ValeurChamp);
                }
             }
          }
          EXEC SQL CLOSE S04;
       }
    }

Discussions similaires

  1. [Flex4] Générer graphique avec nombre de colonne aléatoire
    Par vaccary dans le forum Flex
    Réponses: 1
    Dernier message: 01/07/2011, 15h59
  2. Nombre de colonnes avec le nom de la table
    Par benji41 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/07/2005, 20h17
  3. [débutant] nombre de colonne dan sun fichier csv
    Par mandagor dans le forum C++
    Réponses: 18
    Dernier message: 15/06/2005, 15h42
  4. [JTextArea]changer dynamiquement le nombre de colonnes
    Par MrDuChnok dans le forum Composants
    Réponses: 9
    Dernier message: 27/04/2004, 13h31
  5. [RDB$PRIMARY] Nombre de colonnes
    Par Lucien dans le forum InterBase
    Réponses: 4
    Dernier message: 17/01/2004, 12h55

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