Quelle est la valeur par défaut de précision et l'échelle d'un numéro dans Oracle?
-
09-09-2019 - |
Question
Lors de la création d'une colonne de type NUMBER dans Oracle, vous avez la possibilité de ne pas spécifier une précision ou d'échelle. Qu'est-ce que ces valeurs ne si vous ne les spécifiez pas?
La solution
NUMBER (précision, échelle)
Si une précision n'est pas spécifié, les colonne stocke les valeurs comme indiqué. Si aucune échelle est spécifiée, l'échelle est égal à zéro.
Beaucoup plus d'infos sur:
http://download.oracle. com / docs / cd / B28359_01 / server.111 / b28318 / datatype.htm # CNCPT1832
Autres conseils
Le type de NUMBER
peut être spécifié dans différents styles :
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
Lorsque la précision est le nombre total de chiffres et de l'échelle est le nombre de chiffres à droite ou à gauche (échelle négative) de la virgule décimale.
Oracle indique que ORA-01438
valeur plus grande que la précision spécifiée autorisée pour cette colonne
Comme il est indiqué dans le tableau, cette vérification d'intégrité est actif uniquement si la précision est explicitement spécifié. Sinon, Oracle arrondit silencieusement inséré ou mis à jour valeur à l'aide d'une méthode non spécifiée.
Je crois que la précision par défaut est 38, l'échelle par défaut est zéro. Cependant, la taille réelle d'une instance de cette colonne, est dynamique. Il faudra autant d'espace que nécessaire pour stocker la valeur, ou 21 octets max.
nombres Oracle
magasins de la façon suivante:. 1 byte
de puissance, 1 byte
pour le premier chiffre de mantisse (à savoir une avant le séparateur), le reste pour les autres chiffres
Par digits
ici Oracle
signifie 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
Comme on peut le voir, le nombre maximal ici est 7.(7) * 10^124
, et il a chiffres 19
centésimaux pour la précision, ou 38
chiffres décimaux.
En fait, vous pouvez toujours tester par vous-même.
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';
Je développer la réponse de spectres pour que les gens ne doivent pas essayer eux-mêmes.
Cela a été fait sur la base de données Oracle 11g Express Edition de presse 11.2.0.2.0 -. La production
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';
Ce qui donne
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