Oracle cfqueryparam行为怪异

Oracle cfqueryparam行为怪异,oracle,coldfusion,Oracle,Coldfusion,我在coldfusion中运行更新查询时遇到问题。我收到一个错误,表示CFSQLTYPE CF\u SQL\u NUMERIC的数据“”无效。我知道数据是数字的,因为我在出错之前就输出了它,而且它是正确的。我这样设置变量: <cfset itemID = FORM.itemID * 1> <!--- The * 1 is to force a numeric operation, and therefore a numeric datatype, and like I said

我在coldfusion中运行更新查询时遇到问题。我收到一个错误,表示CFSQLTYPE CF\u SQL\u NUMERIC的数据“”无效。我知道数据是数字的,因为我在出错之前就输出了它,而且它是正确的。我这样设置变量:

<cfset itemID = FORM.itemID * 1> <!--- The * 1 is to force a numeric operation, and
therefore a numeric datatype, and like I said, it outputs right. --->

<!--- This is the line (45) the error says is bad --->
WHERE itemid = <cfqueryparam value="#itemID#" cfsqltype="CF_SQL_NUMERIC">

其中itemid=
发生的一件奇怪的事情是,如果我将cfqueryparam更改为varchar,我仍然会得到相同的错误

WHERE itemid = <cfqueryparam value="#itemID#" cfsqltype="CF_SQL_VARCHAR">
其中itemid=
更奇怪的是,当我完全去掉cfqueryparam并使用一个数字时,出现了一个新的错误,说(44)之前的行现在不好了:

WHERE itemid = 20072 <!--- Changing to this produces a new error on the line before --->

<!--- Line 44, which is also using a cfqueryparam numeric. This new error is the same
as before, but on line 44 now instead of 45. --->
min_qty = <cfqueryparam value="#FORM.itemMinQuantity#" cfsqltype="CF_SQL_NUMERIC">
其中itemid=20072
最小数量=
知道发生了什么吗

编辑更多代码

<cfquery name="qUpdateItem" datasource="#thedb#">
UPDATE items_something
SET
    itemdesc = <cfqueryparam value="#FORM.itemDescription#" cfsqltype="CF_SQL_VARCHAR">,
    room = <cfqueryparam value="#FORM.itemRoom#" cfsqltype="CF_SQL_VARCHAR">,
    value = <cfqueryparam value="#FORM.itemValue#" cfsqltype="CF_SQL_NUMERIC">,
    categoryid = <cfqueryparam value="#FORM.categoryID#" cfsqltype="CF_SQL_NUMERIC">,
    keywords = <cfqueryparam value="#FORM.itemKeywords#" cfsqltype="CF_SQL_VARCHAR">,
    manufact = <cfqueryparam value="#FORM.itemManufacturer#" cfsqltype="CF_SQL_VARCHAR">,
    partno = <cfqueryparam value="#FORM.itemPartNumber#" cfsqltype="CF_SQL_VARCHAR">,
    itemtitle = <cfqueryparam value="#FORM.itemTitle#" cfsqltype="CF_SQL_VARCHAR">,
    qty = <cfqueryparam value="#FORM.itemQty#" cfsqltype="CF_SQL_NUMERIC">,
    assembly_draw_no = <cfqueryparam value="#FORM.itemAssemblyDrawingNo#" cfsqltype="CF_SQL_NUMERIC">,
    bin = <cfqueryparam value="#FORM.itemBin#" cfsqltype="CF_SQL_VARCHAR">,
    shelf = <cfqueryparam value="#FORM.itemShelf#" cfsqltype="CF_SQL_VARCHAR">,
    min_qty = <cfqueryparam value="#FORM.itemMinQuantity#" cfsqltype="CF_SQL_NUMERIC">
WHERE itemid = <cfqueryparam value="#itemID#" cfsqltype="CF_SQL_NUMERIC">

更新项目
设置
itemdesc=,
房间=,
值=,
类别ID=,
关键词=,,
制造商=,
零件号=,
itemtitle=,
数量=,,
装配图编号=,
bin=,
货架=,
最小数量=
其中itemid=

问题可能与queryparam无关。执行语句最后一行的Oracle错误(通常是where、group by或order by子句)。如果您提供ORA-error和表defs,这将有所帮助

但是错误可能与queryparam没有任何关系。还有其他原因(联接中的相同列(例如,查询中两个表中的ID列)、缺少逗号等)

编辑:


根据帮助页面中的文本,您可能希望尝试CF_SQL_FLOAT或CF_SQL_DECIMAL,因为CF_SQL_NUMERIC似乎与Oracle没有直接关联。您也可以检查其他列。我不知道这是否能解释它,但我确实记得在过去看到过这一点。

如果您看到coldfusion错误,它说“on line X”,而on line“X”读取您的where子句,请不要把它放在心上,这是sql的最后一行,因此任何查询都可能是一个问题。当您将该行更改为varchar时,得到相同的错误将证明这一点。@Travis yes它确实有一个值。我在设置之后立即输入了cfoutput itemID,它是正确的。哎呀,我还没来得及删除那条评论,你就已经回复了。lol。请看我的最后一条评论。@Travis您知道我如何获取Oracle错误代码以明确问题所在吗?从您的Oracle IDE(SQL开发人员、Toad等)运行查询。如果您将查询包装在try/catch中并转储catch结构,您就可以看到它。或者,正如上面phantom42所响应的那样,您可以运行查询(在queryparams的实际值中进行子绑定)并查看Oracle在抱怨什么。很可能是cfqueryparam导致某些数据库缓存被清除。午休时间能做的事情真是太神奇了。只要它起作用,有时候这就是你能要求的最好的了。也可能是编译类的问题。我看到有时候类文件不会消失,即使它应该重新编译它们。很长一段时间没有看到它了(也许自从我搬到9号以后就没有了),但它已经发生了。嘿,这是星期一的胜利,对吗?