只有在使用bindParam时,从PHP(PDO)向oracle DB传递浮点数才会引发ORA-01722

xuo3flqw  于 2023-08-04  发布在  Oracle
关注(0)|答案(2)|浏览(101)

下面是一个在PHP中声明的float:

$floatValue = 6.66;

字符串
将其保存到Oracle数据库,如下所示:

$statement = $connection->prepare("INSERT INTO fooTable (numValue) VALUES($floatValue)");
$statement->execute();
//All good!


但是,如果我使用bindParam,则会引发错误ORA-01722:

$statement = $connection->prepare("INSERT INTO fooTable (numValue) VALUES(?)");
$statement->bindParam(1, $floatValue);
$statement->execute();
//ORA-01722 raised


这只会发生在float上,int就可以了。
我试着在我的操作系统中更改小数点分隔符,没有问题。
这是怎么回事
为什么只有浮?
是否有专门针对浮点数的bindParam的替代方法..?

6tdlim6h

6tdlim6h1#

对我有用的是在insert语句之前设置ORACLE十进制分隔符(用于会话):

$stmt = $connection->exec( "ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '. '");

字符串

7tofc5zh

7tofc5zh2#

为我工作:

$floatValue = 6.66;
$statement = $connection->prepare("INSERT INTO fooTable (numValue) VALUES(?)");
$statement->bindParam(1, $floatValue);
$statement->execute();

$s = $connection->prepare('select * from fooTable');
$s->execute();
while ($r = $s->fetch(PDO::FETCH_ASSOC)) {
    var_dump($r);
}

字符串
给出预期输出:

array(1) {
  ["NUMVALUE"]=>
  string(4) "6.66"
}


这是预期的,因为提取转换为字符串。在SQL*Plus中:

SQL> desc fooTable
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NUMVALUE                                           NUMBER

SQL> select * from fooTable;

  NUMVALUE
----------
      6.66

相关问题