Oracle
 sql >> Base de données >  >> RDS >> Oracle

La concaténation de nombres dans l'expression de colonne virtuelle lance ORA-12899 :valeur trop grande pour la colonne

Vos chiffres ne sont pas limités. Avec des nombres à un chiffre (positifs) vous sachez que la longueur concatendée ne peut être que de trois, mais la colonne virtuelle doit être suffisamment grande pour n'importe quel nombre - il semble donc qu'elle autorise jusqu'à 40 chiffres pour le modèle de format implicite (38 chiffres significatifs, le séparateur décimal et le signe; La lexicalisation de @collspar ).

Cela dit, la contrainte de la colonne numérique ne serait pas reflétée dans la longueur de la colonne virtuelle - ce qui rend les deux colonnes NUMBER(1,0) laisse toujours la concaténation nécessitant 81 caractères. Prendre la sous-chaîne de la valeur générée ne fonctionnera pas non plus , dans ce cas obtenir ORA-12899: value too large for column "TEXT" (actual: 10, maximum: 40) . Fournir un modèle de format pour chaque to_char() appeler, par ex. de FM999 ), fonctionnerait mais restreindrait les valeurs de chaque côté du trait de soulignement plutôt que la longueur totale directement.

Si vous souhaitez restreindre la taille de la colonne, vous pouvez la convertir au même type de données et à la même taille, ce qui est plus explicite :

text VARCHAR2(10) generated always as 
    (cast(to_char(id)||'_'||to_char(num) as VARCHAR2(10))) VIRTUAL