Qual é o padrão de precisão e escala para um número no Oracle?
-
09-09-2019 - |
Pergunta
Ao criar uma coluna do tipo NÚMERO no Oracle, você tem a opção de não especificar uma precisão ou escala. O que esses padrão que se você não especificá-los?
Solução
NÚMERO (precisão, escala)
Se a precisão não for especificado, os armazena valores de coluna como dado. Se nenhuma escala é especificado, a escala é zero.
Muito mais informações em:
http://download.oracle. com / docs / cd / B28359_01 / server.111 / b28318 / datatype.htm # CNCPT1832
Outras dicas
O tipo NUMBER
pode ser especificado em estilos diferentes :
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
Quando a precisão é o número total de dígitos e escala é o número de dígitos direita ou esquerda (escala negativa) do ponto decimal.
A Oracle especifica ORA-01438 como
valor maior do que precisão especificadas permitido para esta coluna
Como observado na tabela, esta verificação de integridade é ativa somente se a precisão seja explicitamente especificado. Caso contrário, o Oracle silenciosamente arredonda o inseridos ou atualizados valor usando algum método não especificado.
Eu acredito que a precisão padrão é de 38, a escala padrão é zero. No entanto, o tamanho real de uma instância de esta coluna, é dinâmica. Vai demorar tanto espaço quanto necessário para armazenar o valor, ou no máximo 21 bytes.
armazena Oracle
números da seguinte maneira:. 1 byte
pelo poder, 1 byte
para o primeiro dígito significand (que é um antes do separador), o resto para os outros dígitos
Por digits
aqui significa Oracle
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, o número máximo aqui é 7.(7) * 10^124
, e ele tem dígitos centesimais 19
de precisão, ou dígitos decimais 38
.
Na verdade, você sempre pode testá-lo por si mesmo.
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 expandir a resposta de espectros para que as pessoas não tem que experimentar por si mesmos.
Isso foi feito em Oracle Database 11g Express Edition versão 11.2.0.2.0 -. Produção
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 produz
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