Seus números não são limitados. Com números de um dígito (positivo) você sei que o comprimento concatenado só pode ser três, mas a coluna virtual tem que ser grande o suficiente para qualquer número - então parece que está permitindo até 40 dígitos para o modelo de formato implícito (38 dígitos significativos, o separador decimal e o sinal; lexicalização de @collspar ).
Dito isto, restringir a coluna numérica não seria refletido no comprimento da coluna virtual - tornando ambas as colunas
NUMBER(1,0)
ainda deixa a concatenação exigindo 81 caracteres. Pegar a substring do valor gerado também não funcionará
, neste caso obtendo ORA-12899: value too large for column "TEXT" (actual: 10, maximum: 40)
. Fornecendo um modelo de formato para cada to_char()
chamada, por exemplo de FM999
), funcionaria, mas restringe os valores de cada lado do sublinhado em vez do comprimento total diretamente. Se você deseja restringir o tamanho da coluna, pode convertê-la para o mesmo tipo e tamanho de dados, o que é mais explícito:
text VARCHAR2(10) generated always as
(cast(to_char(id)||'_'||to_char(num) as VARCHAR2(10))) VIRTUAL