Secondo la documentazione Oracle:
Ecco come la vedo io :
- Quando
Precision
è maggiore di Scala (ad es.NUMBER(8,5)
), nessun problema, questo è semplice.Precision
significa che il numero avrà un totale di 8 cifre, 5 delle quali sono nella parte frazionaria (.→), quindi la parte intera (←.) avrà 3 cifre. Questo è facile. -
Quando vedi quella
Precision
è inferiore aScale
(ad es.NUMBER(2, 5)
), questo significa 3 cose :- Il numero non avrà alcuna parte intera, solo una parte frazionaria. Quindi lo 0 nella parte intera non viene conteggiato nei calcoli, dici .12345 non 0,12345. Infatti, se specifichi solo 1 cifra nella parte intera, restituirà sempre un errore.
- La
Scale
rappresenta il numero totale di cifre nella parte frazionaria che avrà il numero. 5 in questo caso. Quindi può essere .12345 o .00098 ma non più di 5 cifre in totale. - La parte frazionaria è divisa in 2 parti, numeri significativi e zeri. I numeri significativi sono specificati da
Precision
e il numero minimo di zeri è uguale a (Scale
-Precision
). Esempio :
qui Il numero dovrà avere un minimo di 3 zeri nella parte frazionaria. seguito da 2 numeri significativi (potrebbe avere anche uno zero). Quindi 3 zeri + 2 numeri significativi =5 che è la
Scale
numero.
In breve, quando vedi ad esempio NUMBER(6,9)
, questo ci dice che la parte frazionaria avrà 9 cifre in totale, iniziando da 3 zeri obbligatori e seguite da 6 cifre.
Ecco alcuni esempi:
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