web-dev-qa-db-fra.com

Quelle est la précision et l'échelle par défaut pour un nombre dans Oracle?

Lors de la création d'une colonne de type NUMBER dans Oracle, vous avez la possibilité de ne pas spécifier de précision ou d'échelle. Que font ces valeurs par défaut si vous ne les spécifiez pas?

60
Matt

NOMBRE (précision, échelle)

Si aucune précision n'est spécifiée, la colonne stocke les valeurs telles qu'elles sont données. Si aucune échelle n'est spécifiée, l'échelle est zéro.

Beaucoup plus d'infos sur:

http://download.Oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832

39
Angelo Marcotullio

Le type NUMBER peut être spécifié dans styles différents :

 Précision résultante résultante 
 Spécification Vérification de l'échelle de précision Commentaire 
 -------------------------------------------------- ―― 
 NUMBER NULL NULL NO  'plage maximale  et  précision' , 
 Valeurs sont stockées  'comme indiqué'  = 
 NUMÉRO (P, S) PS OUI Code d'erreur: ORA-01438 
 NUMÉRO (P) P 0 OUI Code d'erreur: ORA-01438 
 NUMÉRO (*, S) 38 S NON 

Où précision correspond au nombre total de chiffres et échelle à nombre de chiffres à droite ou à gauche (échelle négative) de la virgule décimale.

Oracle spécifie ORA-01438 comme

valeur supérieure à la précision spécifiée autorisée pour cette colonne

Comme indiqué dans le tableau, cette vérification d'intégrité n'est active que si la précision est explicitement spécifiée. Sinon, Oracle arrondit silencieusement la valeur insérée ou mise à jour en utilisant une méthode non spécifiée.

22
maxschlepzig

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, soit 21 octets maximum.

14
baretta

Oracle enregistre les nombres de la manière suivante: 1 byte pour l'alimentation, 1 byte pour le premier chiffre significatif (c'est-à-dire 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 nous pouvons le constater, le nombre maximal ici est 7.(7) * 10^124, et il a 19 Chiffres centésimaux de précision, ou 38 Chiffres décimaux.

9
Quassnoi

En fait, vous pouvez toujours le tester 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';

4
spectra

Je développe la réponse de spectra afin que les gens n’aient pas à l’essayer eux-mêmes.

Cette opération a été effectuée sur Oracle Database 11g Express Edition, version 11.2.0.2.0 - 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'; 

Quels rendements

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    
1
bugybunny