【发布时间】:2012-10-19 21:31:11
【问题描述】:
我昨天遇到了一些事情,我花了一段时间才弄清楚。在此代码中,当正在更新的表中不存在任何记录时,服务器会挂起,并且不会给出超时错误或任何错误。使用第二个表中的记录,代码可以正常工作。
<cfquery name="getSomething">
SELECT one, two
FROM some_table
WHERE conditions = 'my conditions'
</cfquery>
<cfloop query="getSomething">
<cfquery name="updateSomethingElse">
UPDATE other_table
SET three = 'my value'
WHERE four = #getSomething.one#
AND five = #getSomething.two#
</cfquery>
<!--- always run an insert --->
<cfquery name="insertSomething">
INSERT INTO other_table
(columns)
VALUES
(values)
</cfquery>
</cfloop>
我认为这是一个 CF 问题,因为在 Toad 中运行更新查询会在没有记录时完成人们所期望的 - 什么都没有。
我通过首先运行查询来获取第二个表中的记录计数来修复它,并且仅在记录计数大于 0 时才运行更新查询。
这是使用带有修补程序的 Oracle 10、CF 9.02。
注意:select查询返回2K/20K记录之间; 当第二个表中有现有记录时,更新和插入查询都可以正确运行; 删除更新查询允许插入查询运行,而不管第二个表中是否有记录。
编辑:我将探索将更新和插入查询移出循环,如下所示。我仍然认为最初的问题(为什么服务器在第二个表中没有记录的情况下挂起)尚未得到回答。
【问题讨论】:
-
“表格中有记录,代码工作正常。” - 不,它没有;您缺少 cfloop 查询属性的结束引号。如果没有记录,查询循环将不会执行其主体,因此这里肯定有比您在此处显示的更多内容。
-
这只是我为演示问题而输入的内容。实际代码是正确的——正如我所提到的,当表中有记录时它运行良好。此外,选择查询返回 2K 到 20K 记录,具体取决于传递的参数 int。
-
提供实际代码(仅过滤/删除敏感/重复信息)总是让事情变得更容易和更清晰......
-
您目前似乎正在对每一次 2-20K 循环迭代运行更新。如果是这样,请将其移出循环,使其运行一次,(理想情况下,也可以执行插入/选择组合 Matt 建议)。
标签: oracle coldfusion oracle10g sql-update coldfusion-9