Coldfusion更新SQL语句

Coldfusion更新SQL语句,sql,oracle,coldfusion,oracle11g,coldfusion-9,Sql,Oracle,Coldfusion,Oracle11g,Coldfusion 9,我有下面的查询,它使用cfspreadsheet从读取的数据中更新引用数据的表。大约600行,被称为qry1。 SQL大约要运行2分钟才能完成。 我可以改进SQL以改进更新时间吗? products表中有1360000行。 此示例正在更新这些行中的600行。 Oracle版本是11g Coldfusion版本是9.1 <cfloop from="1" to="#qry1.recordcount#" index="i"> <cfquery name="qry2" data

我有下面的查询,它使用cfspreadsheet从读取的数据中更新引用数据的表。大约600行,被称为qry1。 SQL大约要运行2分钟才能完成。 我可以改进SQL以改进更新时间吗? products表中有1360000行。 此示例正在更新这些行中的600行。 Oracle版本是11g Coldfusion版本是9.1

<cfloop from="1" to="#qry1.recordcount#" index="i">
    <cfquery name="qry2" datasource="db1">
        UPDATE PRODUCTS P
        SET P.QTY = <cfqueryparam value="#qry1.ITEM_NEW_INCOMING_QUOTE_QTY#" cfsqltype="cf_sql_numeric" />
        WHERE P.PRODUCT= <cfqueryparam value="#qry1.PRODUCT#" cfsqltype="cf_sql_varchar"  />
        AND EXISTS(
            SELECT QUOTE_ID
            FROM QUOTE Q
            WHERE P.QUOTE_ID = Q.QUOTE_ID
                AND Q.QUOTE_NUMBER = <cfqueryparam value="#Val(qry1.QUOTE_NUMBER)#" cfsqltype="cf_sql_numeric" /> 
            )
    </cfquery>
</cfloop>
更新 不幸的是,由于OP之前遗漏了一些新信息,此解决方案无效

原始答案

我认为你不需要或者甚至不应该使用ColdFusion来做这件事。这将进行600次数据库调用,可能是您花费大量时间的地方。最多只需要CF发送where子句来告诉查询需要更新的600行

您可以使用直接SQL从另一个表更新oracle中的表。 看看这篇文章是否对你有帮助

如果此链接出现问题,最高评分答案的要点是:

UPDATE table1 t1
   SET (name, desc) = (SELECT t2.name, t2.desc
                         FROM table2 t2
                        WHERE t1.id = t2.id)
 WHERE EXISTS (
    SELECT 1
      FROM table2 t2
     WHERE t1.id = t2.id 
     AND  -- your where clause from your first cfquery here
 )

不管怎样,600个单独的更新都需要相当长的时间。如果您不想让用户坐在那里等待,那么可以使用cfthread进行更新,并感谢用户在主线程上提供的文件

或者,您可以简单地上传文件并将其保存在服务器上的某个位置。然后设置一个查找并处理这些文件的计划作业


无论你做什么,不要为了速度而牺牲良好的实践。由于上传的文件是用户输入,因此必须验证接收到的数据

qry1的sql是什么?什么需要2分钟,仅cfloop或上传电子表格、解析电子表格和cfloop的整个页面?如果页面需要2分钟,那么应该在每个不同的进程中使用gettickcount,看看延迟在哪里。正如其他人所提到的,这不是ColdFusion的工作。数据库工具可以更好地处理批量更新。一个选项是将数据导入临时表,而不是执行许多单独的语句。然后验证数据。最后加入临时表进行一次更新。我不会那么快排除ColdFusion。可能可以使用单个cfquery来执行此操作,保持循环。如果需要从CF运行,这将是单个cfquery中的sql。最后一个AND语句可能包括qry1中用于生成初始筛选器的where子句和CF参数。因此,我的声明最多只需要CF发送where子句就可以告诉查询需要更新的600行。真丢脸!!!您不仅没有提到这一点,而且还通过说某个表是否更新引用了另一个表中的数据(您想说的是另一个数据源中的数据)来避免表位于同一数据库中修复您的问题以获得好的答案。包括您的oracle版本。