Bom dia,
passei por um problema que não imaginei que o Oracle (versão Oracle Database 11g Enterprise Edition Release 11.2.0.2.0) poderia deixar acontecer, foi executado um create table dessa forma:
Por incrível que parece não deu erro de execução na instrução mesmo o DECIMAL sendo 15,16! A PRECISÃO MAIOR que a quantidade de ESCALA.
Como a empresa que trabalho usa padrão ANSI resolvi testar no SQL SERVER 2008R2 (versão SQL SERVER NT x64 – 10.50.2500.0) e vejam o resultado:
Também testado no DB2 (versão DB2 9.5):
Para não imaginar que seria problema por utilizar DECIMAL (que é convertido nativamente para NUMBER) testei utilizando NUMBER e em todos ambientes ocorreu o mesmo resultado.
Essa doeu aí em Oracle?
Se alguém da Oracle ler isso podem reportar como BUG?
Obs.: Quando eu for dar minhas xingadas no SQL Server vou lembrar disso! eheheh
Att,
capin
Segundo a Oracle, existe uma explicação:
http://docs.oracle.com/cd/E11882_01/server.112/e10592/sql_elements001.htm
Scale can be greater than precision, most commonly when e notation is used. When scale is greater than precision, the precision specifies the maximum number of significant digits to the right of the decimal point.
For example, a column defined as NUMBER(4,5) requires a zero for the first digit after the decimal point and rounds all values past the fifth digit after the decimal point.
It is good practice to specify the scale and precision of a fixed-point number column for extra integrity checking on input. Specifying scale and precision does not force all values to a fixed length. If a value exceeds the precision, then Oracle returns an error. If a value exceeds the scale, then Oracle rounds it.
Obs.: Obrigado ao Fernando Simon por enviar a resposta.
Olhando a documentação da Oracle é até interssante o motivo deles, mas também é estranho.
Mas estamos ai para ajudar.
Então pelo que entendi criando uma coluna tipo NUMBER(4,5) o primeiro número vai ser sempre 0 e números inseridos estarão obrigatoriamente depois do ponto decimal, mas inserindo mais de 5 números o erro é retornado? Ex.: 0.12345
Pelo que eu entendi é isso mesmo Flavio!
No teu exemplo, NUMBER(4,5), aceitaria 0.01234, mas não aceita 0.012345 e nem 0.12345.
Porque não aceitaria 0.12345 se são 5 números depois do ponto decimal? E o 4 em NUMBER(4,5) está servindo de que se é ele que limita o total de números?
Flávio, é isso que está escrito no trecho da documentação que o capin colou aqui pra gente… veja:
“For example, a column defined as NUMBER(4,5) *** requires a zero for the first digit after the decimal point *** and rounds all values past the fifth digit after the decimal point.”
Como vc mesmo disse, o primeiro número vai ser sempre zero – mas parece que vc não se atentou que é o primeiro número DEPOIS da vírgula.
O 4 está limitando o número de dígitos significativos (ou seja, pode ter até 4 dígitos significativos, enquanto os outros devem ser ZEROS).
NUMBER (4,5)
0,01234 = OK! Como 5 é maior que 4 (1 a mais), então a primeira casa depois da vírgula tem que ser zero. E o TOTAL de casas depois da vírgula é no máximo 5.
0,12345 = Não aceita! Pois o primeiro dígito depois da vírgula não é zero.
Se fosse:
NUMBER (3,6)
0,000123 = OK! 6 -3 = 3. Então tem que ter 3 zeros logo após a vírgula, e depois disso mais 3 dígitos significativos.
Foi isso que eu entendi lendo a documentação.
Massa agora entendi perfeitamente, muito boa a explicação Milton Bastos. VLW
Boa..explicação
A explicação é até viável, mas não considero válida. A notação de um decimal é um mero detalhe, cabe ao AD e ao DBA implementarem da melhor forma.
Para documentar, o SGBD IBM Informix não permite isto (como esperado). O erro abaixo é gerado:
366: The scale exceeds the maximum precision specified.