El valor de la columna no era nulo, estaba corrupto. La representación interna utilizada para los números es descrito en la documentación , o varios otros lugares como este .
El primer byte es el exponente, y puede, simplemente, ser cero, pero no con solo un 3 siguiéndolo. Creo que lo más cerca que puedes llegar es 0,3,102
para -9,8*x10^125
Entonces, veamos cómo se almacenan algunos en los extremos:
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
select 1 * power(10, 126) from dual;
ORA-01426: numeric overflow
Tu valor descargado de 0,3
no tiene el 102 al final que indica un número negativo, pero si fuera positivo, el primer byte sería al menos 128.
Ha habido casos de números corrompidos por programas OCI que los manejaron mal, e incluso la importación heredada hizo lo mismo. Sin saber cómo se crearon originalmente los datos, probablemente nunca sabrá exactamente qué salió mal, cuándo o cuál se suponía que era el valor originalmente.
Es extraño que SQL Developer muestre nulo en la cuadrícula de resultados (parece abortar si consulta como un script); en SQL*Plus no muestra ningún valor incluso si set null
a una cadena fija. SQL Developer, o el controlador JDBC, pueden estar tragando silenciosamente la incapacidad de convertir desde la representación interna.