2016-04-01 2 views
3

Je suis un peu confus avec quel type de données je devrais utiliser pour Oracle Number(*,0) avec zéro échelle et toute précision?Quel cfsqltype utiliser pour le type de données Number (*, 0) d'Oracle dans cfqueryparam?

Lequel dois-je utiliser CF_SQL_INTEGER ou CF_SQL_FLOAT? et pourquoi?

+0

Je sais que les deux '' CF_SQL_INTEGER' et fonctionne CF_SQL_FLOAT', mais honnêtement je ne pensais pas du recommandé de deux à utiliser pour un numéro de orcle (*, 0). – Anurag

+1

N'utiliseriez-vous pas simplement CF_SQL_NUMERIC comme type de données numérique? – haxtbh

+0

@haxtbh, Oui, je pourrais utiliser CF_SQL_NUMERIC. Récemment, j'ai été déplacé vers une application héritée. Ils ont explicitement utilisé CF_SQL_INTEGER pour Number (*, 0) et CF_SQL_FLOAT pour Number (*, entier positif). Maintenant, je me demande pourquoi c'est le cas. –

Répondre

4

Selon la documentation, Number(*,0) signifie que vous travaillez avec les très grands entiers, soit jusqu'à 38 chiffres et sans décimales:

column_name NUMBER (precision, scale)

... précision (nombre total de chiffres) et échelle (nombre de chiffres à la droite de la virgule décimale):

column_name NUMBER (*, scale)

Dans ce cas, la précision est 38 et l'échelle spécifiée est conservée.

Nombre de chiffres trop important pour stocker dans CF_SQL_INTEGER. Pour soutenir toute la gamme, nécessite un type avec une capacité beaucoup plus grande. En regardant la norme JDBC Mappings cela signifie soit java.sql.Types.NUMERIC ou java.sql.Types.DECIMAL. Les deux utilisent le BigDecimal de Java pour le stockage, qui a une capacité plus que suffisante pour Number(38,0).

La matrice cfqueryparam et la documentation Oracle JDBC driver disent toutes les deux la même chose à propos du type DECIMAL. Depuis java.sql.Types.NUMERIC est vraiment juste un synonyme de java.sql.Types.DECIMAL vous pouvez utiliser l'un ou l'autre.

Remarque: Lors de l'utilisation de cfqueryparam, si vous omettez l'attribut "scale", il est par défaut égal à scale = "0", c'est-à-dire sans décimales.

<cfqueryparam type="CF_SQL_DECIMAL" scale="0" value="...."> 
+0

Que se passe-t-il si nous avons le type de données Number (*, 0) pour une colonne de table mais que nous transmettons les valeurs comprises dans la plage entière? –

+0

(Éditer) Si les valeurs * tombent * toujours dans la plage des nombres entiers de 32 bits, vous pouvez utiliser NUMERIC/DECIMAL ou INTEGER. Cependant, si les choses changent et que vous essayez de transmettre une valeur plus grande, cfqueryparam lèvera une exception et la requête ne s'exécutera pas. Cela n'économise pas beaucoup, donc j'ai tendance à m'en tenir au type de table/colonne sous-jacent, à moins qu'il y ait une très bonne raison de ne pas le faire. – Leigh

+0

Merci d'avoir nettoyé. Je travaille sur une application héritée et CF_SQL_INTEGER et CF_SQL_FLOAT sont écrits partout pour le type de données Number. Ce serait vraiment dommage pour nous de changer le cfsqltype en DECIMAL, mais je l'utiliserai pour de nouvelles requêtes. –