2016-04-01 10 views
3

Я немного смущен тем, какой тип данных я должен использовать для Oracle Number(*,0) с нулевой шкалой и любой точностью?Какой cfsqltype используется для типа данных Oracle Number (*, 0) в cfqueryparam?

Какой я должен использовать CF_SQL_INTEGER или CF_SQL_FLOAT? и почему?

+0

Я знаю, что и '' CF_SQL_INTEGER' и CF_SQL_FLOAT' работает, но если честно, я никогда не думал, рекомендуемого двух использовать для Number orcle (*, 0). – Anurag

+1

Разве вы не используете CF_SQL_NUMERIC в качестве числового типа данных? – haxtbh

+0

@haxtbh, Да, я мог бы использовать CF_SQL_NUMERIC. В последнее время меня перевели на устаревшее приложение. Они явно использовали CF_SQL_INTEGER для Number (*, 0) и CF_SQL_FLOAT для Number (*, положительное целое число). Теперь мне интересно, почему так. –

ответ

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

(Edit) Если значения всегда * попадают в 32-битный целочисленный диапазон, вы можете использовать либо NUMERIC/DECIMAL, либо INTEGER. Однако, если что-то изменится, и вы попытаетесь передать значение, которое больше, cfqueryparam выкинет исключение, и запрос не будет запущен. Это не очень экономит, поэтому я склонен придерживаться любого типа таблицы/столбца, если только не существует очень веской причины. – Leigh

+0

Спасибо за прояснение. Я работаю над устаревшим приложением, и у него есть CF_SQL_INTEGER и CF_SQL_FLOAT, написанные везде для типа данных Number. Нам будет очень плохо изменить cfsqltype на DECIMAL, но я буду использовать его для новых запросов. –