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

PostgreSQL Discussion :

Requête dynamique et ecpg


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de GDMINFO
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 350
    Par défaut Requête dynamique et ecpg
    Bonjour,

    j'essaye de faire une requête dynamique du type :

    je voulais savoir s'il était possible de mettre un nom de table variable, car les requêtes dynamiques fonctionnent bien avec un champ variable dans la clause where, dans un delete ou un insert mais je ne parviens pas à faire cela pour le nom de la table dans la requête.

    Merci,

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,


    il faut construire la chaîne de caractère dynamiquement.

  3. #3
    Membre éclairé Avatar de GDMINFO
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 350
    Par défaut
    C'est à dire ?

    En gros je ne peux pas faire ça ? (ci-dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    EXEC SQL BEGIN DECLARE SECTION;
    const char* requete = "SELECT * FROM ?;";
    char nomTable[NAMEDATALEN];
    EXEC SQL END DECLARE SECTION;
     
    printf("Quelle table voulez-vous afficher ? (nom)\n");
    scanf("%s",nomTable);
     
    /* declaration statement + curseur ... */
     
    EXEC SQL OPEN curseur USING :nomTable

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    avec execute
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  5. #5
    Membre éclairé Avatar de GDMINFO
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 350
    Par défaut
    Euh...

    mais je ne vois pas bien où placer un execute... s'agit-il de quelque chose de ce genre ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXEC SQL EXECUTE statement USING :nomTable;
    Il faut le mettre avant d'ouvrir le curseur ??

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute 'select * from  '|| quote_ident (nom_table)

  7. #7
    Membre éclairé Avatar de GDMINFO
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 350
    Par défaut
    Bon, je ne comprend pas voici ce que j'ai déclaré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    EXEC SQL DECLARE curseur2 refcursor;
     
    EXEC SQL WHENEVER NOT FOUND DO BREAK;
    EXEC SQL OPEN curseur2 FOR EXECUTE 'select * from  '|| quote_ident (:nomTable);
     
    /* ensuite traitement avec un FETCH curseur2 INTO .... */
    et il me fait cette erreur :

    ERREUR : erreur de syntaxe sur ou près de « refcursor »
    error: expected declaration or statement at end of input
    :-(

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173

  9. #9
    Membre éclairé Avatar de GDMINFO
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 350
    Par défaut
    Je dois être un peu stupide mais ça ne fonctionne toujours pas, plusieurs tentatives :
    1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    EXEC SQL PREPARE stat(char[NAMEDATALEN]) AS 'select * from '|| quote_ident($1); 
    EXEC SQL DECLARE curseur2 CURSOR FOR stat(:nomTable);
    EXEC SQL WHENEVER NOT FOUND DO BREAK;
    EXEC SQL OPEN curseur2;
    erreur de syntaxe sur ou près de « 'select * from ' »
    2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    EXEC SQL PREPARE stat AS select * from quote_ident($1);
    EXEC SQL DECLARE curseur2 CURSOR FOR stat;
    EXEC SQL WHENEVER NOT FOUND DO BREAK;
    EXEC SQL OPEN curseur2 USING :nomTable;
    Compile mais ensuite problème au niveau de la lecture, je ne pense pas du coup qu'il interprète correctement la variable nomTable
    J'ai mis l'exemple 2, surtout parce que quels que soient les changements que je peux faire (je n'ai mis que deux exemples mais j'ai fait plein d'autres tests), c'est toujours ce qui suit le AS dans le PREPARE qui coince...

    Bref ?
    Merci pour votre patience...

  10. #10
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Je pense qu'une instruction préparée a besoin de connaitre au minimum les colonnes dans le SELECT et les tables dans le FROM. Sinon je vois pas comment elle peut être préparée.
    @+

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

Discussions similaires

  1. Requête sur une requête dynamique...
    Par kluh dans le forum Access
    Réponses: 4
    Dernier message: 17/11/2005, 19h59
  2. [pb requête sql] Requête dynamique
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/09/2005, 12h31
  3. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  4. [Procs stockées] [Débutant] Requête dynamique
    Par stailer dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2005, 14h29
  5. Requête dynamique en pagination
    Par pascal_fluck@hotmail.com dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/03/2005, 16h04

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