Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 01/10/2015 13:09:32
- jacques
- Membre
ecpg : indicateur (variable indicatrice) et type varchar
Bonjour,
Dans le cadre de tests avec ecpg (PostgreSQL 9.4.0) 4.10.0, j'ai rencontré deux difficultés :
===> Primo :
test sur valeur de l'indicateur (variable indicatrice de marqueur NULL) d'une variable float
Le programme ecpg :
=================
...
connexion();
EXEC SQL BEGIN DECLARE SECTION;
float ff;
int i_ff;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT 1256898899999885888855424885522.125666666558855555555555555555555555555554458955 INTO :ff :i_ff ;
if (i_ff == 0) printf("indicateur 0 ; résultat valeur ind : %f %d \n", ff, i_ff);
if (i_ff > 0) printf("indicateur positif (valeur tronquee) ; résultat valeur ind : %f %d \n", ff, i_ff);
return 0;
Le résultat du lancement de l'exécutable :
========================================
indicateur 0 ; résultat valeur ind : 1256898867335759245102806990848.000000 0
La question :
===========
Pourquoi l'indicateur vaut 0 (n'est donc pas strictement positif) alors que la valeur est tronquée (modifiée) ?
===> Secundo :
test sur variable varchar
Selon http://docs.postgresqlfr.org/9.4/ecpg-variables.html, paragrahe " 33.4.6. Indicateurs " :
"
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR val;
int val_ind;
EXEC SQL END DECLARE SECTION:
...
EXEC SQL SELECT b INTO :val :val_ind FROM test1;
"
Le programme ecpg :
=================
...
connexion();
EXEC SQL BEGIN DECLARE SECTION;
varchar vv;
int i_vv;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT 'ceci est une chaine de caracteres' INTO :vv :i_vv ;
return 0;
A la pré-compilation ecpg :
=========================
ERREUR : les pointeurs sur des chaînes de caractères (varchar) ne sont pas implantés
Question :
========
Pourquoi ce message d'erreur alors qu'un exemple est donné dans la doc. PostgreSQL 9.4 citée ci-avant ?
Merci par avance.
Hors ligne
#2 05/10/2015 18:06:18
- jacques
- Membre
Re : ecpg : indicateur (variable indicatrice) et type varchar
Bonjour,
La réponse de la part de Michael Meskes :
"
> Why the indicator equals 0 (is not strictly positive) and the value is
> truncated (modified) ?
Because according to standard C types it is not truncated. The string does
have more digits tha a flot can handle, but they are all valid, i.e. a
convesion does correctly eat them all but the internal representation is not
able to store them all.
You bring up an interesting point here, the data is not exactly truncated, it
is just rounded. Not sure what (if anything) the standard says.
> Why this error message whereas an example is given in the PostgreSQL 9.4
> documentation (see above) ?
I guess the documentation is wrong, but I have to look into it. Normally the
varchar type needs a length (as an array of char) or it will become a pointer
to char.
"
Hors ligne