使用PHP(PDO)将浮点数传递给Oracle数据库,只有在使用bindParam时才会引发ORA-01722错误。

19 浏览
0 Comments

使用PHP(PDO)将浮点数传递给Oracle数据库,只有在使用bindParam时才会引发ORA-01722错误。

以下是用PHP声明的浮点数:\n

$floatValue = 6.66;

\n将其保存到Oracle数据库中的操作是正常的:\n

$statement = $connection->prepare("INSERT INTO fooTable (numValue) VALUES($floatValue)");
$statement->execute();
//一切正常!

\n然而,如果使用bindParam,会出现ORA-01722错误:\n

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

\n这只发生在浮点数上,整数没有问题。\n我尝试在操作系统中更改小数分隔符,没有问题。\n那么这里发生了什么?\n为什么只有浮点数会出错?\n有没有针对浮点数的bindParam的替代方法..?

0
0 Comments

问题出现的原因是将浮点数作为参数传递给Oracle数据库时,如果使用bindParam函数绑定参数,可能会引发ORA-01722错误。解决方法是使用bindValue函数代替bindParam函数绑定参数。

解决方法示例代码如下:

$floatValue = 6.66;
$statement = $connection->prepare("INSERT INTO fooTable (numValue) VALUES(:num)");
$statement->bindValue(':num', $floatValue, PDO::PARAM_STR);
$statement->execute();
$s = $connection->prepare('select * from fooTable');
$s->execute();
while ($r = $s->fetch(PDO::FETCH_ASSOC)) {
    var_dump($r);
}

这样修改后,将浮点数作为字符串绑定到参数中,可以成功插入和查询数据,不会出现ORA-01722错误。

0
0 Comments

在使用PHP(PDO)将浮点数传递给Oracle数据库时,如果使用bindParam方法,可能会引发ORA-01722错误。这个问题的原因是Oracle数据库在处理浮点数时,对于小数点的处理存在差异。解决方法是在插入语句之前,通过设置ORACLE小数分隔符(对于会话)来解决这个问题。

具体的解决方法是使用以下代码来设置ORACLE小数分隔符:

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

这行代码将会将ORACLE的小数分隔符设置为点号和空格,这样在执行插入操作时,ORACLE数据库就能正确地处理浮点数,避免了ORA-01722错误的出现。

通过这种方法,可以确保在使用PHP(PDO)将浮点数传递给Oracle数据库时,不会出现ORA-01722错误,保证了数据的准确性和一致性。

0