Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1