Tenho uma tabela com coluna numérica:
create table test (a number(2,0));
Em seguida, desejo criar uma coluna virtual com base na coluna a:
alter table test add (b varchar2(3) as ('A:'||to_char(a)));
Isso resulta em erro:
ORA-12899: value too large for column "B" (actual: 12, maximum: 42)
Por que recebo esse erro? Isso funciona se eu substituir to_char por substr, mas estou curioso para saber como o Oracle determina os valores "reais" e "máximos"?
Suspeito que o valor máximo esteja relacionado à precisão máxima dos tipos numéricos (Oracle ignorando a precisão do tipo de dados), mas ainda não entendi muito bem esse erro. O conjunto de caracteres é UTF-8.
A mensagem de erro é um tanto estranha conforme apresentada, mas quando você recebe esta mensagem criando uma coluna virtual, o valor para
maximum
é o comprimento mínimo que você precisa especificar para poder criar a coluna.A razão para isso é que o Oracle não sabe o comprimento máximo da expressão
to_char(a)
e assume que será de 40 caracteres: 38 casas de precisão para o número, mais 1 para cada ponto decimal e indicador positivo/negativo.Adicione 2 caracteres para "A:" e o comprimento mínimo que a Oracle julga como "seguro" é 42.
Use um formato com o seu
to_char
:Curiosamente, o Oracle não parece verificar o comprimento real neste caso na versão 11.2.0.3.0: