如果所有小数都为0,Oracle是否删除Number数据类型的尾随小数位?

vjhs03f7  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(141)

我们正在将应用程序的数据库从Oracle迁移到Postgres。在测试连接到新Postgres数据库和外部下游消费者应用程序的应用程序时,我们观察到一些奇怪的行为。高级应用程序流程如下:
1.我们的应用程序将一行写入其中一个表
1.我们的应用程序将表中的行读入Java对象
1.我们的应用程序将此对象解析为XML,然后在队列中发送该XML
1.第三方应用程序使用队列中的此消息并对其进行处理
在我们的Oracle数据库中,有一个名为AMOUNT的列的表,该列定义为NUMBER(18,2)。我们已经将Postgres数据库中的此列迁移到NUMERIC(18,2)
我们观察到的问题是,在迁移之后,第三方应用程序无法处理新消息,因为XML中的AMOUNT字段现在被格式化为3000.00,而它们应该是3000。他们不期望任何小数位。
我做了一些调查,发现这是因为在Oracle DB中,当我们编写3000.00时,它实际上被存储为3000,并以这种方式发送到下游应用程序。然而,当我们将3000.00写入Postgres时,它实际上存储为3000.00,然后由我们的应用程序检索。
我找不到任何文档说明Oracle在小数位为零时会截断小数位,但这是我观察到的行为。这是Oracle的预期行为吗?如果我们将3000.01插入Oracle数据库,它就像这样存储。似乎只有当小数位为.00时才截断小数位

smdnsysy

smdnsysy1#

这是一个表示问题,而不是数据存储问题。Oracle和PostgreSQL都按照列的定义存储满量程和精度;然而,当值被转换为没有指定格式的文本时,表示是特定于实现的。由于下游应用程序似乎期望整数值,因此在生成XML之前,要么将AMOUNT转换为bigint,要么显式格式化它;例如AMOUNT::BIGINTTO_CHAR(AMOUNT 'FM999999999999999990')

相关问题