Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

estouro numérico com coluna NULL (0,3)


O valor da coluna não era nulo, estava corrompido. A representação interna usada para números é descrito na documentação , ou vários outros lugares como este .

O primeiro byte é o expoente, e pode - apenas - ser zero, mas não com apenas um 3 a seguir. O mais próximo que acho que você pode chegar é 0,3,102 para -9,8*x10^125

Dos documentos :

Então, vamos ver como alguns dos extremos são armazenados:
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

Seu valor despejado de 0,3 não tem o 102 no final denotando um número negativo, mas se fosse positivo o primeiro byte seria pelo menos 128.

Houve casos de números sendo corrompidos por programas OCI que os manipularam incorretamente e até mesmo importação de legado fazendo o mesmo. Sem saber como os dados foram originalmente criados, você provavelmente nunca saberá exatamente o que deu errado, ou quando, ou qual deveria ser o valor originalmente.

É estranho que o SQL Developer mostre nulo na grade de resultados (parece abortar se você consultar como um script); no SQL*Plus não mostra nenhum valor mesmo se você set null para uma corda fixa. O SQL Developer, ou o driver JDBC, pode estar apenas engolindo silenciosamente a incapacidade de converter a partir da representação interna.