使用 OPENQUERY 将值插入 Oracle 时出现精度问题 table
Precision Issue when using OPENQUERY to insert values into Oracle table
我需要通过 OPENQUERY 将精度为小数点后 5 位的值插入到 Oracle 接口 table 中,因为这些值最初存储在 SQL 数据库中。 Oracle table 列的数据类型为 NUMBER(未指定 scale/precision)。使用 OPENQUERY 插入值 1.4,结果 Oracle table 中存储的值为 1.3999999999999999。我无法将 Oracle table 的数据类型更改为 NUMBER(38,5) 因为它是标准的 Oracle table (GL_DAILY_RATES_INTERFACE).
根据 Oracle https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
"If a precision is not specified, the column stores values as given."
这意味着如果我插入 1.4,它应该按原样存储在 NUMBER 列中。但事实并非如此。那么这是否意味着当通过 OPENQUERY 插入链接的 Oracle 服务器时,Oracle Provider for OLE DB 会进行一些加法转换,从而导致浮点错误?
如何将精度为小数点后 5 位的值插入到未指定精度或小数位数的 Oracle table NUMBER 列中?
更新:
我的插入语句 does 在插入时对值进行舍入。但这并不能解决问题。
例如:
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 table 中的值插入到 Oracle table,然后使用 EXEC() 更新和舍入 Oracle 中的值再次table。
我需要通过 OPENQUERY 将精度为小数点后 5 位的值插入到 Oracle 接口 table 中,因为这些值最初存储在 SQL 数据库中。 Oracle table 列的数据类型为 NUMBER(未指定 scale/precision)。使用 OPENQUERY 插入值 1.4,结果 Oracle table 中存储的值为 1.3999999999999999。我无法将 Oracle table 的数据类型更改为 NUMBER(38,5) 因为它是标准的 Oracle table (GL_DAILY_RATES_INTERFACE).
根据 Oracle https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
"If a precision is not specified, the column stores values as given."
这意味着如果我插入 1.4,它应该按原样存储在 NUMBER 列中。但事实并非如此。那么这是否意味着当通过 OPENQUERY 插入链接的 Oracle 服务器时,Oracle Provider for OLE DB 会进行一些加法转换,从而导致浮点错误?
如何将精度为小数点后 5 位的值插入到未指定精度或小数位数的 Oracle table NUMBER 列中?
更新: 我的插入语句 does 在插入时对值进行舍入。但这并不能解决问题。 例如:
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 table 中的值插入到 Oracle table,然后使用 EXEC() 更新和舍入 Oracle 中的值再次table。