Согласно документации, 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="....">
Я знаю, что и '' CF_SQL_INTEGER' и CF_SQL_FLOAT' работает, но если честно, я никогда не думал, рекомендуемого двух использовать для Number orcle (*, 0). – Anurag
Разве вы не используете CF_SQL_NUMERIC в качестве числового типа данных? – haxtbh
@haxtbh, Да, я мог бы использовать CF_SQL_NUMERIC. В последнее время меня перевели на устаревшее приложение. Они явно использовали CF_SQL_INTEGER для Number (*, 0) и CF_SQL_FLOAT для Number (*, положительное целое число). Теперь мне интересно, почему так. –