PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 11/08/2010 15:25:25

Afsol
Membre

Précompilateur C avec SQL embarqué

Bonjour,

Le pré-compilateur ecpg ne comprend pas la directive 'RETURNING ... INTO ...'.
Il semble ne pas admettre de variable hôte.

Exemple :
    La requête suivante :
        EXEC SQL INSERT INTO  fremise
                     (resite, remach, redatech, renobord)
              VALUES (:pRem->resite_tc:pRem->i_resite, :pRem->remach_tc:pRem->i_remach,
                      :pRem->redatech_tc:pRem->i_redatech, :pRem->renobord_l:pRem->i_renobord)
             RETURNING renum INTO :pRem->renum_l:pRem->i_renum;

   génère le code C suivant en passant dans le pré-compilateur ecpg :
        { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into fremise ( resite , remach , redatech , renobord ) values ( $1  , $2  , $3  , $4  ) returning renum",
        ECPGt_char,(pRem->resite_tc),(long)7 + 1,(long)1,(7 + 1)*sizeof(char),
        ECPGt_int,&(pRem->i_resite),(long)1,(long)1,sizeof(int),
        ECPGt_char,(pRem->remach_tc),(long)2 + 1,(long)1,(2 + 1)*sizeof(char),
        ECPGt_int,&(pRem->i_remach),(long)1,(long)1,sizeof(int),
        ECPGt_char,(pRem->redatech_tc),(long)10 + 1,(long)1,(10 + 1)*sizeof(char),
        ECPGt_int,&(pRem->i_redatech),(long)1,(long)1,sizeof(int),
        ECPGt_long,&(pRem->renobord_l),(long)1,(long)1,sizeof(long),
        ECPGt_int,&(pRem->i_renobord),(long)1,(long)1,sizeof(int), ECPGt_EOIT, ECPGt_EORT);}

   où la partie 'INTO' du RETURNING a disparu et où n'apparaît pas la variable pRem->renum_l ni son indicateur..

   Le pré-compilateur renvoie l'erreur suivante :
        sgbd_traitrans.o ... /usr2/filip/sources/stap/serveur/sgbd_traitrans.ec:1273: ERROR: syntax error at or near "INTO"

Est-il possible de modifier la pré-compilation afin de gérer cette clause ?
En vous remerciant par avance ...

Hors ligne

#2 11/08/2010 15:38:24

gleu
Administrateur

Re : Précompilateur C avec SQL embarqué

Pas sûr qu'ecpg accepte cette instruction. À votre place, j'essaierais plutôt de placer la requête dans une chaîne et de l'exécuter avec un "EXEC SQL EXECUTE mystmt INTO les variables USING les valeurs;". C'est une requête préparée, donc ne pas oublier le "EXEC SQL PREPARE" avant. Voir la fin de http://www.postgresql.org/docs/9.0/stat … namic.html pour un exemple complet.


Guillaume.

Hors ligne

#3 11/08/2010 17:22:38

Afsol
Membre

Re : Précompilateur C avec SQL embarqué

Merci gleu pour cette réponse.

Mais on était un peu insatisfait quand même de devoir préparer puis exécuter une requête. Alors on a cherché sur le net ...
Et on a trouvé une solution (incomplète... ) mais qui marche une fois complétée.

C'est sur http://archives.postgresql.org/pgsql-bu … g00039.php
Bug #5489 déclaré et réparé par "Alexander" <goal81@gmail.com> avec réponse de Michael Meskes <meskes@postgresql.org>.

On se permet de compléter l'info :
   Dans .../src/interfaces/ecpg/preproc/preproc.y changer la ligne :
        returning_clause:  RETURNING target_list
   par la ligne :
        returning_clause:  RETURNING target_list ecpg_into

   mais changer également la ligne d'instruction :
         $$ = cat_str(2,make_str("returning"),$2);
   par :
         $$ = cat_str(3,make_str("returning"),$2,$3);

Ça compile et même ... ça fonctionne en plus !
Merci à tous ...

Hors ligne

#4 11/08/2010 17:33:49

gleu
Administrateur

Re : Précompilateur C avec SQL embarqué

En effet, c'est mieux. Ce patch a été intégré dans les versions 8.3, 8.4 et 9.0. Je vous conseille donc de mettre à jour votre version de PostgreSQL dès la prochaine sortie de versions mineures.


Guillaume.

Hors ligne

Pied de page des forums