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?

Foi útil?

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    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top