"NULL"列的数字溢出 (0,3)



我有一个表(Oracle 12.1.0.2.0(,当我将值相加时,我会得到

ORA-01426: numeric overflow
01426. 00000 -  "numeric overflow"
*Cause:    Evaluation of an value expression causes an overflow/underflow.
*Action:   Reduce the operands.

当我在SQL Developer中检查值时,我在"NULL"列中看到,这对函数和来说应该没有问题。

当我对这个表使用dump(col1(时,结果是

Typ=2 Len=2: 0,3

对于包含NULL的列,这不应该是NULL吗?

此外,检查"不是null"没有筛选行。

导出数据仅导出第一行的一部分,并在该0,3第一次出现后停止。

SQL导航器将"error"显示为此列的值。

表是作为选择创建的。现在它被截断并重新填充,NULL行为NULL,求和就可以了。

那个专栏的内容是什么?为什么SQL Developer显示NULL而不是错误?

列值不是null,它已损坏。用于数字的内部表示在文档中或类似的其他地方进行了描述。

第一个字节是指数,它可以-只是-为零,但后面不能只有3。我认为你能得到的最接近的0,3,102是-9.8*x10^125

来自文档:

NUMBER数据类型存储零以及正负固定数,其绝对值从1.0 x 10^-130到1.0 x 10^ 126,但不包括在内。

所以让我们看看一些极端的东西是如何存储的:

with t (n) as (
select  1 * power(10, -130) from dual
union all select  1 * power(10, 125) from dual
union all select -1 * power(10, -130) from dual
union all select -1 * power(10, 125) from dual
union all select -9.7 * power(10, 125) from dual
union all select -9.8 * power(10, 125) from dual
union all select -9.85 * power(10, 125) from dual
union all select -9.9 * power(10, 125) from dual
)
select n, dump(n) d1, dump(n, 1016) d2 from t
N D1                             D2
----------- ------------------------------ ------------------------------
1.000E-130 Typ=2 Len=2: 128,2             Typ=2 Len=2: 80,2
1.000E+125 Typ=2 Len=2: 255,11            Typ=2 Len=2: ff,b
-1.000E-130 Typ=2 Len=3: 127,100,102       Typ=2 Len=3: 7f,64,66
-1.000E+125 Typ=2 Len=3: 0,91,102          Typ=2 Len=3: 0,5b,66
-9.700E+125 Typ=2 Len=3: 0,4,102           Typ=2 Len=3: 0,4,66
-9.800E+125 Typ=2 Len=3: 0,3,102           Typ=2 Len=3: 0,3,66
-9.850E+125 Typ=2 Len=4: 0,3,51,102        Typ=2 Len=4: 0,3,33,66
-9.900E+125 Typ=2 Len=3: 0,2,102           Typ=2 Len=3: 0,2,66

如果指定的算术表达式的值的绝对值大于或等于1.0 x 10126,则Oracle将返回错误。

select  1 * power(10, 126) from dual;
ORA-01426: numeric overflow

0,3的转储值末尾没有102表示负数,但如果它是正数,则第一个字节至少为128。

曾经有过OCI程序处理不当导致数字损坏的例子,甚至遗留导入也会这样做。如果不知道数据最初是如何创建的,你可能永远不会知道到底出了什么问题,什么时候出了问题,或者最初应该是什么值


奇怪的是,SQL Developer在结果网格中显示null(如果您以脚本形式进行查询,它似乎会中止(;在SQL*Plus中,即使set null为固定字符串,它也不会显示任何值。SQL开发人员或JDBC驱动程序可能只是默默地接受了无法从内部表示转换的问题。

最新更新