使用 OPENQUERY 将值插入 Oracle 表时的精度问题

问题描述

我需要通过 OPENQUERY 将精度为 5 位小数的值插入到 Oracle 接口表中,因为这些值最初存储在 sql 数据库中。 Oracle 表列的数据类型为 NUMBER(未指定小数位数/精度)。使用 OPENQUERY 插入值 1.4,结果在 Oracle 表中存储的值为 1.3999999999999999。我无法将 Oracle 表的数据类型更改为 NUMBER(38,5),因为它是标准 Oracle 表 (GL_DAILY_RATES_INTERFACE)。

根据甲骨文https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832

“如果未指定精度,则列存储给定值。”

这意味着如果我插入 1.4,它应该按原样存储在 NUMBER 列中。但事实并非如此。那么这是否意味着当通过 OPENQUERY 插入到链接的 Oracle 服务器时,OLE DB 的 Oracle Provider 会执行一些导致浮点错误的加法转换?

如何将精度为 5 位小数的值插入到未指定精度或小数位数的 Oracle 表 NUMBER 列中?

更新: 我的插入语句确实在插入时对值进行四舍五入。但这并不能解决问题。 例如:

INSERT INTO OPENQUERY(LINKEDSERVER,"SELECT CONVERSION_RATE FROM GL_DAILY_RATES_INTERFACE") VALUES(ROUND(1.4,5))

解决方法

由于通过 OPENQUERY 向链接的 Oracle 服务器插入值会导致一些浮点错误,我尝试使用 EXEC('') AT LINKEDSERVER 并且它起作用了。由于该语句直接在 ORACLE 服务器上执行,因此不再存在 Oracle Provider for OLE DB 进行任何意外转换的问题。

我的整体解决方案是首先使用 OPENQUERY 将值从 SQL 表插入到 Oracle 表中,然后使用 EXEC() 再次更新和舍入 Oracle 表中的值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...