prog:oracle_datatype_number
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
prog:oracle_datatype_number [2019/07/15 14:31] – [Was bedeutet es aber wenn die Scale größer als die Precision ist?] gpipperr | prog:oracle_datatype_number [2019/07/15 14:44] (aktuell) – [Was bedeutet es wenn die "Scale" Angabe größer als die "Precision" Stellenzahl ist?] gpipperr | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | =====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. | ||
+ | |||
+ | <code sql> | ||
+ | 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: | ||
+ | |||
+ | |||
+ | Passt die Number Definition der Spalte nicht zur Zahl, die wir einfügen wollen, erhalten wir einen " | ||
+ | |||
+ | |||
+ | So weit so gut. | ||
+ | |||
+ | |||
+ | Aber was bedeuten die folgenden Angaben bei der Definition von Number? | ||
+ | |||
+ | * Scale => Precision | ||
+ | * Scale negativ | ||
+ | * Precision Stellen Anzahl kleiner als die Stellenanzahl des negative Scale **number(1, | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Was bedeutet es wenn die " | ||
+ | |||
+ | Beispiel: | ||
+ | |||
+ | <code sql> | ||
+ | |||
+ | create table num_test2( c1 number(9, | ||
+ | |||
+ | </ | ||
+ | |||
+ | 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. | ||
+ | |||
+ | |||
+ | |||
+ | <code sql> | ||
+ | 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: | ||
+ | <code sql> | ||
+ | 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: | ||
+ | |||
+ | <code sql> | ||
+ | -- 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 | ||
+ | ---------------------------------------- ----------------- | ||
+ | Typ=2 Len=6: 191, | ||
+ | Typ=2 Len=6: 191, | ||
+ | Typ=2 Len=2: 187,2 .0000000000010 | ||
+ | |||
+ | </ | ||
+ | |||
+ | D.h. in eine Number(9, | ||
+ | |||
+ | |||
+ | 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. | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | -- Anzeige in SQL Plus setzen | ||
+ | set numf 9999 | ||
+ | |||
+ | -- Tabelle anlegen | ||
+ | |||
+ | create table num_test3 ( c1 number(4, | ||
+ | |||
+ | -- 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; | ||
+ | |||
+ | | ||
+ | ----- ----- | ||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Precision Stellen Anzahl kleiner aus das negative Scale ==== | ||
+ | |||
+ | |||
+ | Wirklich unleserlich wird der Code wenn die Anzahl der Gesamtstellen kleiner sind als das negative Scale. | ||
+ | |||
+ | <code sql> | ||
+ | |||
+ | create table num_test6 ( c1 number(1, | ||
+ | |||
+ | |||
+ | 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, | ||
+ | |||
+ | -------------- | ||
+ | |||
+ | |||
+ | select * from num_test6; | ||
+ | |||
+ | | ||
+ | ------------------- ------------------- | ||
+ | 0 1 | ||
+ | 0 99 | ||
+ | 0 999 | ||
+ | 10000 9999 | ||
+ | 90000 94999 | ||
+ | | ||
+ | |||
+ | -- Die größte Zahl die sich noch einfügen lässt ist die " | ||
+ | -- 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:// | ||
+ | |||
+ | Oracle: | ||
+ | |||
+ | * https:// | ||
+ | * https:// |
prog/oracle_datatype_number.txt · Zuletzt geändert: 2019/07/15 14:44 von gpipperr