使用PHP(PDO)将浮点数传递给Oracle数据库,只有在使用bindParam时才会引发ORA-01722错误。
使用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的替代方法..?
问题出现的原因是将浮点数作为参数传递给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错误。
在使用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错误,保证了数据的准确性和一致性。