Oracle
 sql >> Database >  >> RDS >> Oracle

Come può un Oracle NUMBER avere una scala più grande della Precision?

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 a Scale (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