Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Das Verketten von Zahlen in virtuellen Spaltenausdrücken löst ORA-12899 aus:Wert zu groß für Spalte

Ihre Zahlen sind nicht eingeschränkt. Mit einstelligen (positiven) Zahlen Sie wissen, dass die verkettete Länge nur drei sein kann, aber die virtuelle Spalte muss groß genug für jede Zahl sein - es sieht also so aus, als ob sie bis zu 40 Ziffern für das implizite Formatmodell zulässt (38 signifikante Ziffern, das Dezimaltrennzeichen und das Vorzeichen; @collspars Lexikalisierung ).

Allerdings würde sich die Einschränkung der Zahlenspalte nicht in der virtuellen Spaltenlänge widerspiegeln - beide Spalten wären NUMBER(1,0) lässt immer noch die Verkettung, die 81 Zeichen erfordert. Das Nehmen der Teilzeichenfolge des generierten Werts funktioniert auch nicht , in diesem Fall wird ORA-12899: value too large for column "TEXT" (actual: 10, maximum: 40) angezeigt . Bereitstellen eines Formatmodells für jedes to_char() anrufen, z. von FM999 ), würde funktionieren, beschränkt aber die Werte auf beiden Seiten des Unterstrichs und nicht direkt die Gesamtlänge.

Wenn Sie die Spaltengröße einschränken möchten, können Sie sie in denselben Datentyp und dieselbe Größe umwandeln, was expliziter ist:

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