Bonjour,

Nous avons des soucis avec les paramètres de requète de valeur flotante.

Le contexte :
Oracle 9i, client 9i, Appli sous delphi 2010 (edit : même problème avec XE2) avec DBExpress

La table est simplement :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
CREATE TABLE ESSAISAND
(
  CHAMP1  VARCHAR2(5 BYTE),
  CHAMP2  FLOAT(126),
  CHAMP3  NUMBER(19,10),
  CHAMP4  NUMBER
)

La requète :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
insert into ESSAISAND
 (CHAMP1,CHAMP2,CHAMP3,CHAMP4) 
VALUES 
(:CHAMP1,:CHAMP2,:CHAMP3,:CHAMP4)

A l'exécution, en utilisant ParamByName :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
  sqlqUERY1.ParamByName('CHAMP4'   ).AsFloat := 3.33;
On obtient l'erreur :
---------------------------
Testconnexiondbexpress
---------------------------
ORA-00932: types de données incohérents : %s attendu ; %s obtenu.
---------------------------
OK
---------------------------
L'erreur est la même avec CHAMP2 et CHAMP3.

En fouillant sur le net on trouve des solutions qui fonctionent partiellement :
AsBCD
Code : Sélectionner tout - Visualiser dans une fenêtre à part
  sqlqUERY1.ParamByName('CHAMP3'   ).AsBcd := 2.22;
Fonctionne si la valeur est faible.
Ceci ne fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
  D :=  1230000000000000000000000000.456;
  sqlqUERY1.ParamByName('CHAMP3'   ).AsBcd := d;
retourne :
---------------------------
Testconnexiondbexpress
---------------------------
Opération en virgule flottante incorrecte.
---------------------------
OK
---------------------------
AsFmtBCD
Fonction sur les petits nombre mais toujours pas sur les grands :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
  D :=  1230000000000000000000000000.456;
  sqlqUERY1.ParamByName('CHAMP3'   ).AsFMTBCD := Doubletobcd(d);
---------------------------
Testconnexiondbexpress
---------------------------
1,23E27 n'est pas une valeur BCD correcte.
---------------------------
OK
---------------------------

AsFloat fonctione nickel avec FireBird/DBExpress mais aussi avec Oracle/BDE !

Une solution est de se passer des paramètres :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
insert into ESSAISAND
 (CHAMP1,CHAMP2,CHAMP3,CHAMP4) 
VALUES 
(:CHAMP1,:CHAMP2,:CHAMP3,'1.23E27')
Là, la valeur est stockée correctement (Vérifié dans Toad)... Mais ensuite elle ne s'affiche plus si on affiche la table dans un DbGrid via un ClientDataset.

Quelqu'un a eut une solution ?
Je ne peux pas utiliser de composants spécifiques à Oracle car nos applis sont multibases (suivant les clients) FireBird/Oracle/SQLServer.

On vient de se passer du BDE et suivi la recommandation de passer à DBexpress... Tout est basé sur DbExpress maintenant. Et nos tests ont été fait avec FireBird où il n'y a aucun souci.