2016-04-01 34 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將會非常糟糕,但我會將其用於新的查詢。 –

相關問題