Qual è il difetto di precisione e la scala di un numero di Oracle?
-
09-09-2019 - |
Domanda
Quando si crea una colonna di tipo NUMBER in Oracle, si ha la possibilità di non specificare una precisione o la scala. Cosa significano questi predefinita fare se non li si specifica?
Soluzione
NUMERO (precisione, scala)
Se una precisione non è specificato, i negozi colonna Valori come dato. Se non viene specificato scala, la scala è pari a zero.
Molto più informazioni all'indirizzo:
http://download.oracle. com / docs / cd / B28359_01 / server.111 / b28318 / datatype.htm # CNCPT1832
Altri suggerimenti
Il tipo NUMBER
può essere specificato nel stili differenti :
Resulting Resulting Precision Specification Precision Scale Check Comment ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― NUMBER NULL NULL NO 'maximum range and precision', values are stored 'as given' NUMBER(P, S) P S YES Error code: ORA-01438 NUMBER(P) P 0 YES Error code: ORA-01438 NUMBER(*, S) 38 S NO
Dove la precisione è il numero totale di cifre e la scala è il numero di destra o sinistra cifre (scala negativa) del punto decimale.
Oracle specifica ORA-01438 come
valore maggiore di precisione specificata consentito per la colonna
Come indicato nella tabella, questo controllo di integrità è attivo solo se la precisione è esplicitamente specificato. In caso contrario, Oracle arrotonda in silenzio il inserito o aggiornato valore utilizzando un metodo non specificato.
Credo che la precisione di default è 38, scala di default è pari a zero. Tuttavia la dimensione effettiva di un'istanza di questa colonna, è dinamica. Ci vorrà tutto lo spazio necessario per memorizzare il valore, o max 21 byte.
memorizza Oracle
numeri nel modo seguente:. 1 byte
per potenza, 1 byte
per la prima cifra significando (cioè una prima del separatore), il resto per le altre cifre
Per digits
qui Oracle
significa centesimal digits
(i. E. base 100
)
SQL> INSERT INTO t_numtest VALUES (LPAD('9', 125, '9'))
2 /
1 row inserted
SQL> INSERT INTO t_numtest VALUES (LPAD('7', 125, '7'))
2 /
1 row inserted
SQL> INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))
2 /
INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))
ORA-01426: numeric overflow
SQL> SELECT DUMP(num) FROM t_numtest;
DUMP(NUM)
--------------------------------------------------------------------------------
Typ=2 Len=2: 255,11
Typ=2 Len=21: 255,8,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79
Come si può vedere, il numero massimo qui è 7.(7) * 10^124
, e lui hanno cifre 19
centesimali per la precisione, o cifre decimali 38
.
In realtà, si può sempre provare da soli.
CREATE TABLE CUSTOMERS
(
CUSTOMER_ID NUMBER NOT NULL,
JOIN_DATE DATE NOT NULL,
CUSTOMER_STATUS VARCHAR2(8) NOT NULL,
CUSTOMER_NAME VARCHAR2(20) NOT NULL,
CREDITRATING VARCHAR2(10)
)
;
select column_name, data_type, nullable, data_length, data_precision, data_scale
from user_tab_columns where table_name ='CUSTOMERS';
I ampliare la risposta di spettri così la gente non c'è bisogno di provare per se stessi.
Questo è stato fatto su Oracle Database 11g Express Edition uscita 11.2.0.2.0 -. Produzione
CREATE TABLE CUSTOMERS
(
CUSTOMER_ID NUMBER NOT NULL,
FOO FLOAT NOT NULL,
JOIN_DATE DATE NOT NULL,
CUSTOMER_STATUS VARCHAR2(8) NOT NULL,
CUSTOMER_NAME VARCHAR2(20) NOT NULL,
CREDITRATING VARCHAR2(10)
);
select column_name, data_type, nullable, data_length, data_precision, data_scale
from user_tab_columns where table_name ='CUSTOMERS';
che produce
COLUMN_NAME DATA_TYPE NULLABLE DATA_LENGTH DATA_PRECISION DATA_SCALE
CUSTOMER_ID NUMBER N 22
FOO FLOAT N 22 126
JOIN_DATE DATE N 7
CUSTOMER_STATUS VARCHAR2 N 8
CUSTOMER_NAME VARCHAR2 N 20
CREDITRATING VARCHAR2 Y 10