2016-04-01 3 views
3

Ich bin ein wenig verwirrt mit welchem ​​Datentyp ich für Oracle Number(*,0) mit Nullskala und jeder Genauigkeit verwenden soll?Welcher cfsqltype für den Number (*, 0) -Datentyp von Oracle in cfqueryparam?

Welche sollte ich verwenden CF_SQL_INTEGER oder CF_SQL_FLOAT? und warum?

+0

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

+1

Würden Sie nicht einfach CF_SQL_NUMERIC als numerischen Datentyp verwenden? – haxtbh

+0

@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. –

Antwort

4

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="...."> 
+0

Was ist, wenn wir den Datentyp Number (*, 0) für eine Tabellenspalte haben, aber die Werte übergeben, die innerhalb des Ganzzahlbereichs liegen? –

+0

(Bearbeiten) Wenn die Werte * immer * innerhalb des 32-Bit-Ganzzahlbereichs liegen, können Sie entweder NUMERIC/DECIMAL oder INTEGER verwenden. Wenn sich die Dinge jedoch ändern und Sie versuchen, einen größeren Wert einzugeben, wird cfqueryparam eine Ausnahme auslösen, und die Abfrage wird nicht ausgeführt. Es spart nicht wirklich viel, also bleibe ich bei dem, was der zugrunde liegende Tabellen-/Spaltentyp ist, es sei denn, es gibt einen sehr guten Grund, dies nicht zu tun. – Leigh

+0

Danke fürs Aufräumen. Ich arbeite an einer Legacy-App und es wurden CF_SQL_INTEGER und CF_SQL_FLOAT überall für Number-Datentyp geschrieben. Es wird sehr schlecht für uns sein, den cfsqltype in DECIMAL one zu ändern, aber ich werde ihn für neue Abfragen verwenden. –

Verwandte Themen