2012-06-18 4 views
1

Документация ColdFusion для функции valuelist говорит, что она НЕ оценивает значения, и именно так она всегда вела себя для меня в прошлом. Я использовал функцию valuelist много раз в прошлом и никогда раньше не сталкивался с этой проблемой. Мы используем CF9.0.1, но это первоначально появилось на примере CF9.0.Почему valuelist конвертирует целые числа в float?

Ситуация возникла по мере того, как мы вытаскиваем значения из базы данных Oracle, которая поддерживает значения float. Сохраненные значения представляют собой целые числа, а не плавающие. Код ниже воспроизводит поведение, которое мы видим. Данные извлекаются через хранимые процедуры, которые мы МОЖЕТ изменить (используя CAST), но хотели бы избежать, если это возможно.

<cfscript> 
    qryVLTest = queryNew('member_id') ; 
    for (i = 1; i LTE 10; i=i+1) { 
     queryAddRow(qryVLTest,1) ; 
     querySetCell(qryVLTest,'member_id',i) ; 
    } 
    writedump(qryVLTest) ; 
    writeoutput(valuelist(qryVLTest.member_id)) ; 
</cfscript> 

Дамп отображает ожидаемые значения: целые числа 1-10.

Однако выход функции valuelist возвращает следующие:

1,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0

Все значения после реализации первый из них оценивается и преобразуется в поплавки. Почему это и как я могу предотвратить это в будущем?

+0

все еще делает это, если вы явно задаете тип столбца: qryVLTest = queryNew ('member_id', 'integer'); ? – azawaza

+0

В этом случае нет. Но большую часть времени я вытаскиваю значения 'number' из базы данных Oracle, обычно с помощью хранимых процедур. Этот тип данных может содержать float, но сохраненные значения являются целыми числами. –

ответ

6

У вас есть 2 варианта. Вы можете:

querySetCell(qryVLTEst,"member_id","#i#") 

Который должен заставлять строку. Или вы можете указать INT, если это то, что вы хотите (как указал азаваза).

queryNew("member_id","Integer"); 
+0

Спасибо. Это работает для кода примера, но это не работает, когда мы извлекаем данные из базы данных. Я уточнил вопрос, чтобы объяснить ситуацию немного более четко. –

+0

Каков тип данных в Oracle? Это что-то вроде float с масштабом 0 (эмуляция int) или это фактический тип данных int? –

+0

Если я помню, что правильный Oracle имеет один тип «числа» с подтипами для int и т. Д. Но это то, где мои знания прекращаются :) Я знаю, что вы не хотите использовать литье, но, возможно, переименовываете столбец как PLS_INTEGER или подтип числа как INT исправит это? –

3

Я знаю, что вы сказали, что не хотите использовать CAST(), но, возможно, вы имели в виду Oracle. Помните, что вы можете CAST в CF, а также с помощью Q из Q.

Запустите Oracle Query, а затем использовать запрос запроса переделать номер, как в

<cfquery name="blah" dbtype="query"> 
SELECT CAST(member_ID AS Integer) AS member_ID 
FROM myFancyPantsOracleQuery 
</cfquery> 

Это будет делать трюк, я думаю.

+0

Да, в Oracle, поскольку мы стараемся избегать возиться с хранимыми процедурами, насколько мы можем. QoQ, вероятно, является лучшим решением в нашей ситуации. Просто очень странно, почему первое значение остается как целое число, но другие оцениваются как плавающие, хотя CF говорит, что он вообще не оценивает значения. –

+0

Возможно, что-то связанное с драйвером Oracle было бы моим догадком. извините, нет идеального решения. –

Смежные вопросы