2016-04-01 33 views
3

我对于Oracle的Number(*,0)应该使用哪种数据类型有零点和任何精度有点困惑?在cfqueryparam中用于Oracle的Number(*,0)数据类型的哪个cfsqltype?

我应该使用哪一个CF_SQL_INTEGERCF_SQL_FLOAT?为什么?

+0

我知道,无论'CF_SQL_INTEGER'和'CF_SQL_FLOAT'的作品,但老实说,我从来没有想过推荐的两个使用一个ORCLE号(*,0)。 – Anurag

+1

难道你只是使用CF_SQL_NUMERIC作为它的数字数据类型吗? – haxtbh

+0

@haxtbh,是的,我可以使用CF_SQL_NUMERIC。最近,我被转移到了遗留应用程序。他们已经明确使用Number(*,0)的CF_SQL_INTEGER和Number(*,正整数)的CF_SQL_FLOAT。现在我想知道为什么是这样。 –

回答

4

根据该文件,Number(*,0)意味着你有非常大的整数工作,即高达38位数字,没有小数位:

column_name NUMBER (precision, scale)

... 精度(总数位数)和规模(位数到 小数点的右边)号:

column_name NUMBER (*, scale)

在这种情况下,精度为38,指定的比例为 。

这是太多的数字存储在CF_SQL_INTEGER。为了支持全系列,需要具有更大容量的类型。查看标准JDBC Mappings,这意味着要么是java.sql.Types.NUMERIC要么是java.sql.Types.DECIMAL。这两种都使用java的BigDecimal进行存储,这对于Number(38,0)来说具有足够的容量。

cfqueryparam矩阵和Oracle JDBC driver文档都对DECIMAL类型说同一件事。由于java.sql.Types.NUMERIC实际上只是java.sql.Types.DECIMAL的同义词,因此您可以使用其中任何一个。

注意:使用cfqueryparam时,如果省略“scale”属性,则默认为scale =“0”,即无小数位。

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

如果我们对表列有数据类型Number(*,0),但我们传递的是整数范围内的值,那该怎么办? –

+0

(编辑)如果这些值将总是落在32位整数范围内,那么您可以使用NUMERIC/DECIMAL或INTEGER。但是,如果事情发生变化,并且您尝试传入更大的值,那么cfqueryparam将引发异常,并且查询不会运行。它并没有真正节省太多,所以我倾向于坚持任何基础表/列类型,除非有一个非常好的理由不这样做。 – Leigh

+0

感谢您的清理。我正在开发一个旧版应用程序,并且它具有为Number数据类型编写的CF_SQL_INTEGER和CF_SQL_FLOAT。将cfsqltype更改为DECIMAL将会非常糟糕,但我会将其用于新的查询。 –

相关问题