Während ich gestern eine Antwort auf eine Frage gab, schlug ich vor, eine VIRTUELLE SPALTE für berechnete Werte, anstatt sie manuell zu aktualisieren.
Ich habe selbst einen Test durchgeführt und ein Problem mit der Datengröße festgestellt, die der virtuelle Spaltenausdruck während der Verkettung zwei NUMBER -Typ-Spalten benötigt. Allerdings kein Problem beim Verketten von zwei Zeichen.
DB-Version:
%Vor%Testfall 1: Verketten von Strings
%Vor%Es gibt also keine Probleme beim Verknüpfen von zwei Zeichenspalten.
Testfall 2: Verkettung von Zahlen
%Vor%Nicht erlaubt? Hä! Lassen Sie uns die Größe erhöhen -
%Vor%Was ist jetzt passiert? Die Tabelle wurde erstellt, aber warum VIRTUELLE SPALTE diese Größe einnimmt, wenn die erwartete Datengröße nur 3 Byte beträgt, benötigt sie jedoch 81 Byte .
Bei der Überprüfung der Länge ist der Wert korrekt, die Datengröße ist jedoch viel größer. Zum Beispiel erwarte ich, dass die Länge 3 ist, also deklariere ich die Größe der Spalte als 10 Bytes. Aber der virtuelle Spaltenausdruck liefert den Wert mit einer Größe, die viel größer ist als diese.
%Vor%Jede Einsicht ist mehr als willkommen.
UDPATE Danke an Alex Poole. Ich habe nicht über die implizite Konvertierung nachgedacht, daher war es mir nicht wichtig, den Ausdruck explizit zu interpretieren. Also, das Folgende funktioniert -
%Vor%Ihre Zahlen sind nicht eingeschränkt. Mit einstelligen (positiven) Zahlen you wissen Sie, dass die konkludierte Länge nur drei sein kann, aber die virtuelle Spalte muss für jede Zahl groß genug sein - es sieht also so aus, als ob sie implizit 40 Ziffern erlaubt format model (38 signifikante Ziffern, das Dezimaltrennzeichen und das Zeichen; @ Collspars lexicalisation ).
Nachdem das gesagt wurde, würde das Einschränken der Zahlenspalte nicht in der virtuellen Spaltenlänge widergespiegelt werden - wodurch beide Spalten NUMBER(1,0)
immer noch die Konkatenation mit 81 Zeichen belassen. Die Unterzeichenfolge des generierten Werts funktioniert auch nicht , in diesem Fall erhalten Sie ORA-12899: value too large for column "TEXT" (actual: 10, maximum: 40)
. Bereitstellen eines Formatmodells für jeden to_char()
-Aufruf, z. of FM999
), würde funktionieren, schränkt aber die Werte auf beiden Seiten des Unterstrichs und nicht direkt auf die Gesamtlänge ein.
Wenn Sie die Spaltengröße einschränken möchten, können Sie sie in denselben Datentyp und dieselbe Größe umwandeln, was expliziter ist:
%Vor%Tags und Links oracle numbers sqldatatypes oracle12c virtual-column