我有一个表(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驱动程序可能只是默默地接受了无法从内部表示转换的问题。