Oracle数字精度等级:加载数据时为ORA-01438

时间:2017-04-26 09:12:27

标签: sql oracle

我的表格结构

CREATE TABLE ACCT
(ACCT_NO varchar2(15),
CASH number(20,4))

当前数据:

ACCT_NO   CASH
12        1E16

当我尝试将ORA-01438: value larger than specified precision allowed for this column的值作为CASH插入新记录时,我收到错误1E16

INSERT INTO ACCT VALUES(12, 1E16)

但如果我尝试复制并插入现有数据,则效果很好。

INSERT INTO acct
select * FROM ACCT
WHERE acct=12

我打错了什么? 我知道精度也包括比例长度,即NUMBER(20,4)表示16位精度. 4位数刻度。那么为什么有一个17位精度的数据呢?如果我重新插入相同的数据,我将面临任何错误?

编辑1: SELECT TO_CHAR(CASH) FROM ACCT返回9999999999999999(16位数)。 但是,SELECT CASH FROM ACCT会返回1E16

因此,oracle正在向现有数据9999999999999999添加1并将我的数据显示为1E16,即9999999999999999+1=1E16

此表中有大约300万个数据,我提供给客户的数据提取显示为1E16而不是9999999999999999。不知不觉的用户的完全盲点。

此类数据可能在任何其他表中都可用。是否有任何解决方案,以便SELECT CASH FROM ACCT查询显示9999999999999999而不是1E16

0 个答案:

没有答案