¿Cuál es el valor por defecto de precisión y escala de un número en Oracle?
-
09-09-2019 - |
Pregunta
Al crear una columna de tipo NUMBER de Oracle, usted tiene la opción de no especificar una precisión o escala. ¿Qué hacen estos por defecto si no se especifica ellos?
Solución
NÚMERO (precisión, escala)
Si no se especifica una precisión, las tiendas de columna valores como dado. Si no se especifica la escala, la escala es cero.
Mucho más información en:
http://download.oracle. com / docs / cd / B28359_01 / server.111 / b28318 / datatype.htm # CNCPT1832
Otros consejos
El tipo NUMBER
se puede especificar en href="http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#sthref119" diferentes estilos :
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
Cuando la precisión es el número total de dígitos y la escala es el número de derecho dígitos o izquierda (escala negativa) del punto decimal.
Oracle especifica ORA-01438 como
valor mayor que la precisión especificada permitida para esta columna
Como se ha indicado en la tabla, esta comprobación de integridad sólo se activa si la precisión se especifica explícitamente. De lo contrario Oracle redondea en silencio insertado o actualizado valor utilizando algún método no especificado.
Creo que la precisión predeterminada es de 38, de escala por defecto es cero. Sin embargo, el tamaño real de una instancia de esta columna, es dinámica. Se llevará a todo el espacio necesario para almacenar el valor, ó un máximo de 21 bytes.
almacena números Oracle
de la siguiente manera:. 1 byte
para la energía, 1 byte
para el primer dígito significand (que es uno antes del separador), el resto de los otros dígitos
Por digits
aquí 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
Como podemos ver, el número máximo aquí es 7.(7) * 10^124
, y tener dígitos 19
centesimales de precisión, o dígitos decimales 38
.
En realidad, siempre se puede probar por ti mismo.
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';
Me ampliar la respuesta de espectros para que las personas no tienen que probar por sí mismos.
Esto se hizo sobre la base de datos Oracle 11g Express Edition Release 11.2.0.2.0 -. Producción
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';
que 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