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

Como um Oracle NUMBER pode ter uma Escala maior que a Precisão?


De acordo com a documentação da Oracle:

Aqui está como eu vejo:
  • Quando Precision é maior que Escala (por exemplo, NUMBER(8,5) ), não há problema, isso é simples. Precision significa que o número terá um total de 8 dígitos, dos quais 5 estão na parte fracionária (.→), então a parte inteira (←.) terá 3 dígitos. Isso é fácil.

  • Quando você vê que Precision é menor que Scale (por exemplo, NUMBER(2, 5) ), isso significa 3 coisas:
    • O número não terá parte inteira, apenas parte fracionária. Então o 0 na parte inteira não é contado nos cálculos, você diz 0,12345 e não 0,12345. Na verdade, se você especificar apenas 1 dígito na parte inteira, sempre retornará um erro.
    • A Scale representa o número total de dígitos na parte fracionária que o número terá. 5 neste caso. Portanto, pode ser 0,12345 ou 0,00098, mas não pode ter mais de 5 dígitos no total.
    • A parte fracionária é dividida em 2 partes, números significativos e zeros. Números significativos são especificados por Precision , e o número mínimo de zeros é igual (Scale - Precision ). Exemplo:



    aqui O número deve ter no mínimo 3 zeros na parte fracionária. seguido por 2 números significativos (pode ter um zero também). Portanto, 3 zeros + 2 números significativos =5, que é a Scale número.

Em resumo, quando você vê, por exemplo, NUMBER(6,9) , isso nos diz que a parte fracionária terá 9 dígitos no total, começando por 3 zeros obrigatórios e seguidos por 6 dígitos.

Aqui estão alguns exemplos :
SELECT CAST(.0000123 AS NUMBER(6,9)) FROM dual;   -- prints: 0.0000123; .000|012300
SELECT CAST(.000012345 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012345
SELECT CAST(.123456 AS NUMBER(3,4)) FROM dual;    -- ERROR! must have a 1 zero (4-3=1)
SELECT CAST(.013579 AS NUMBER(3,4)) FROM dual;    -- prints: 0.0136; max 4 digits, .013579 rounded to .0136