Gemäß der Dokumentation, Number(*,0)
bedeutet, dass Sie mit sehr großen Zahlen arbeiten, dh bis zu 38 Ziffern und ohne Dezimalstellen:
column_name NUMBER (precision, scale)
... Präzision (Gesamtzahl der Ziffern) und Skala (Anzahl der Ziffern der rechten Seite des Dezimalpunktes):
column_name NUMBER (*, scale)
In diesem Fall ist die Genauigkeit 38 und die angegebene Skalierung ist .
Das sind zu viele Ziffern zum Speichern in CF_SQL_INTEGER
. Um den gesamten Bereich zu unterstützen, ist ein Typ mit einer viel größeren Kapazität erforderlich. Betrachtet man den Standard JDBC Mappings, so bedeutet dies entweder java.sql.Types.NUMERIC
oder java.sql.Types.DECIMAL
. Beide verwenden Javas BigDecimal für den Speicher, der mehr als genug Kapazität für Number(38,0)
hat. Die cfqueryparam Matrix und Oracle JDBC driver Dokumentation sagen beide dasselbe über den DECIMAL-Typ. Da java.sql.Types.NUMERIC
eigentlich nur ein Synonym für java.sql.Types.DECIMAL
ist, kann man beides verwenden.
Hinweis: Wenn Sie cfqueryparam verwenden und das Attribut "scale" nicht angeben, wird standardmäßig scale = "0", dh keine Dezimalstellen, verwendet.
<cfqueryparam type="CF_SQL_DECIMAL" scale="0" value="....">
Ich weiß, dass beide 'CF_SQL_INTEGER' und' CF_SQL_FLOAT' funktioniert, aber ehrlich gesagt ich habe nie gedacht, die empfohlenen zwei für eine orcle Nummer zu verwenden (*, 0). – Anurag
Würden Sie nicht einfach CF_SQL_NUMERIC als numerischen Datentyp verwenden? – haxtbh
@haxtbh, Ja, ich könnte CF_SQL_NUMERIC verwenden. Vor kurzem wurde ich in eine Legacy-Anwendung verschoben. Sie haben explizit CF_SQL_INTEGER für Number (*, 0) und CF_SQL_FLOAT für Number (*, positive Ganzzahl) verwendet. Jetzt frage ich mich, warum das so ist. –