Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment un Oracle NUMBER peut-il avoir une échelle supérieure à la précision ?

Selon la documentation Oracle :

Voici comment je le vois :

  • Quand Precision est supérieur à l'échelle (par exemple NUMBER(8,5) ), pas de problème, c'est simple. Precision signifie que le nombre aura un total de 8 chiffres, dont 5 sont dans la partie fractionnaire (.→), donc la partie entière (←.) aura 3 chiffres. C'est facile.
  • Quand vous voyez cette Precision est inférieur à Scale (par exemple NUMBER(2, 5) ), cela signifie 3 choses :

    • Le nombre n'aura pas de partie entière, seulement une partie fractionnaire. Ainsi, le 0 dans la partie entière n'est pas compté dans les calculs, vous dites 0,12345 et non 0,12345. En fait, si vous ne spécifiez qu'un seul chiffre dans la partie entière, une erreur sera toujours renvoyée.
    • L'Scale représente le nombre total de chiffres dans la partie fractionnaire que le nombre aura. 5 dans ce cas. Cela peut donc être .12345 ou .00098 mais pas plus de 5 chiffres au total.
    • La partie fractionnaire est divisée en 2 parties, les nombres significatifs et les zéros. Les nombres significatifs sont spécifiés par Precision , et le nombre minimum de zéros est égal à (Scale - Precision ). Exemple :

    ici Le nombre devra avoir un minimum de 3 zéros dans la partie fractionnaire. suivi de 2 nombres significatifs (peut également avoir un zéro). Donc 3 zéros + 2 nombres significatifs =5 qui est l'Scale numéro.

En bref, quand vous voyez par exemple NUMBER(6,9) , cela nous indique que la partie fractionnaire aura 9 chiffres au total, commençant par 3 zéros obligatoires et suivis de 6 chiffres.

Voici quelques exemples :

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