=====Besonderheiten bei der Definition des Number Datentypes in Oracle===== Mit dem Oracle Datentyp Number(p,s) wird ein Festkommazahl definiert, bei der Definition wird die Anzahl der dezimalen Gesamtstellen und der Stellen nach dem Komma angeben. Eine Integer Zahl kann dann mit Number(p) definiert werden. column_name NUMBER (precision, scale) * precision = Gesammtstellen Zahl * scale= Nachkommastellen Auf die Angabe der Gesamtstellen kann auch verzichtet werden (wird dann automatisch 38), mit **NUMBER (*, scale)** . Siehe orginal Doku:https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Data-Types.html#GUID-75209AF6-476D-4C44-A5DC-5FA70D701B78 Passt die Number Definition der Spalte nicht zur Zahl, die wir einfügen wollen, erhalten wir einen "**ORA-01438: value larger than specified precision allowed for this column**" Fehler. So weit so gut. Aber was bedeuten die folgenden Angaben bei der Definition von Number? * Scale => Precision **number(9,12)** * Scale negativ **number(4,-2)** * Precision Stellen Anzahl kleiner als die Stellenanzahl des negative Scale **number(1,-4)** ---- ====Was bedeutet es wenn die "Scale" Angabe größer als die "Precision" Stellenzahl ist?==== Beispiel: create table num_test2( c1 number(9,12)); Wir können nun also maximal eine Zahl mit 9 Gesamtstellen einfügen, die 12 Nachkommastellen hat. Das ist auf den ersten Blick etwas unlogisch, erst wenn wir die führenden 0 nach dem Komma ignorieren kommen wir in den Zahlenbereich der sich dann einfügen lässt. Aber wenn wir uns die Exportpotential Schreibweise der Zahl anschauen wird es logischer, mit 1.234566789 e-12 läßt sich so eine Zahl ja auch schreiben. SQL> insert into num_test2 values (0.00123456789); insert into num_test2 values (0.00123456789) * ERROR at line 1: ORA-01438: value larger than specified precision allowed for this column So funktioniert es: insert into num_test2 values (0.000123456789); insert into num_test2 values (0.000999999999); insert into num_test2 values (0.000000000001) Was wurde eingefügt: -- Zahlenausgabe auf min 12 Stellen hinter dem Komma setzen! set numf 99D9999999999999 column intern format a40 select dump(c1) as intern,c1 from num_test2; INTERN C1 ---------------------------------------- ----------------- Typ=2 Len=6: 191,2,24,46,68,90 .0001234567890 Typ=2 Len=6: 191,10,100,100,100,100 .0009999999990 Typ=2 Len=2: 187,2 .0000000000010 D.h. in eine Number(9,12) Spalte können Werte von 0.000000000001 bis 0.000999999999 eingefügt werden. Wir können also eine Maske auf die führenden 0 für eine Nachkommazahl setzen. Und nun die spannende Frage: Wo braucht man das????? ---- ====Was bedeutet es wenn Scale negativ ist?==== Ein Typ Number mit Negativer Scale wird um die Stellenanzahl gerundet. -- Anzeige in SQL Plus setzen set numf 9999 -- Tabelle anlegen create table num_test3 ( c1 number(4,-2), c2 number(4,0)); -- Werte einfügen insert into num_test3 values ( 1249,1249); insert into num_test3 values ( 1250,1250); -- Ergebnis -- Negativer Scale rundet die Zahl ab/auf! select c1,c2 from num_test3; C1 C2 ----- ----- 1200 1249 1300 1250 ---- ==== Precision Stellen Anzahl kleiner aus das negative Scale ==== Wirklich unleserlich wird der Code wenn die Anzahl der Gesamtstellen kleiner sind als das negative Scale. create table num_test6 ( c1 number(1,-4),c2 number(5)); insert into num_test6 values ( 1,1); insert into num_test6 values ( 99,99); insert into num_test6 values ( 999,999); insert into num_test6 values ( 9999,9999); insert into num_test6 values ( 94999,94999); -------------- select * from num_test6; C1 C2 ------------------- ------------------- 0 1 0 99 0 999 10000 9999 90000 94999 -- Die größte Zahl die sich noch einfügen lässt ist die "94999" -- und das nur bei der Angabe von 1 Stelle ... --- Ab 95000 >> ORA-01438 da ja aufgerundet werden muss und dann sind wir 6 Stellig Und nun die spannende Frage: Wo braucht man das? Der Code ist damit wohl nicht mehr leicht verständlich. ---- ==== Quellen==== Web: * https://gerardnico.com/db/oracle/number Oracle: * https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Data-Types.html#GUID-75209AF6-476D-4C44-A5DC-5FA70D701B78 * https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832