Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_datatype_number

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

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
prog/oracle_datatype_number.txt · Zuletzt geändert: 2019/07/15 14:44 von gpipperr