Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_datatype_number

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
prog:oracle_datatype_number [2019/07/15 14:40]
gpipperr
prog:oracle_datatype_number [2019/07/15 14:44] (aktuell)
gpipperr [Was bedeutet es wenn die "Scale" Angabe größer als die "Precision" Stellenzahl ist?]
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) 
 +</code>
 +
 +
 +  * 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:
 +
 +<code sql>
 +
 +create table num_test2( c1 number(9,12));
 +
 +</code>
 +
 +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
 +
 +</code>
 +
 +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)
 +
 +
 +</code> 
 +
 +
 +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                                                  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
 +
 +</code>
 +
 +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.
 +
 +
 +<code sql>
 +-- 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
 +
 +
 +</code>
 +
 +
 +----
 +
 +==== 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,-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
 +
 +</code>
 +
 +
 +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
"Autor: Gunther Pipperr"
prog/oracle_datatype_number.txt · Zuletzt geändert: 2019/07/15 14:44 von gpipperr