Oracle
 sql >> Database >  >> RDS >> Oracle

La concatenazione dei numeri nell'espressione della colonna virtuale genera ORA-12899:valore troppo grande per la colonna

I tuoi numeri non sono vincolati. Con numeri a una cifra (positivi) tu sapere che la lunghezza concatenata può essere solo tre, ma la colonna virtuale deve essere abbastanza grande per qualsiasi numero, quindi sembra che consenta fino a 40 cifre per il modello di formato implicito (38 cifre significative, il separatore decimale e il segno; lessicalizzazione di @collspar ).

Detto questo, vincolare la colonna del numero non si rifletterebbe nella lunghezza della colonna virtuale, rendendo entrambe le colonne NUMBER(1,0) lascia ancora la concatenazione che richiede 81 caratteri. Anche l'acquisizione della sottostringa del valore generato non funzionerà , in questo caso ottenendo ORA-12899: value too large for column "TEXT" (actual: 10, maximum: 40) . Fornire un modello di formato per ogni to_char() chiamare, ad es. di FM999 ), funzionerebbe ma limita i valori su entrambi i lati del trattino basso anziché direttamente la lunghezza complessiva.

Se desideri limitare la dimensione della colonna, puoi eseguirne il cast allo stesso tipo e dimensione di dati, il che è più esplicito:

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