我有一个结构数组。我需要将该数组中的所有行插入到表中。所以我只是简单地用cfquery
里面cfloop
插入到数据库中。
有人建议我不要在 cfloop 中使用 cfquery,因为每次它都会与数据库建立新连接。
但就我而言,有什么办法可以在不使用 cfquery 中的 cfloop 的情况下做到这一点?
我有一个结构数组。我需要将该数组中的所有行插入到表中。所以我只是简单地用cfquery
里面cfloop
插入到数据库中。
有人建议我不要在 cfloop 中使用 cfquery,因为每次它都会与数据库建立新连接。
但就我而言,有什么办法可以在不使用 cfquery 中的 cfloop 的情况下做到这一点?
与其说是维护连接,不如说是通过“n”个请求访问服务器,以便为 cfloop 中的每次迭代插入或更新数据。对几条记录进行测试似乎没问题,但是当您将其投入生产并且您的客户端推动您的应用程序查看几百行时,您将访问数据库服务器几百次出色地。
正如 Scott 建议的那样,您应该看到循环构建单个查询而不是多次命中数据库。在 cfquery 内部循环的好处是您可以使用 cfqueryparam,但如果您可以信任数据,即。它已经被清理过了,您可能会发现使用 cfsavecontent 之类的东西来构建您的查询并在最后输出 cfquery 中的字符串会更容易。
根据数据库,将结构数组转换为 XML,然后将其作为单个参数传递给存储过程。
在存储过程中,执行 INSERT INTO SELECT,其中 SELECT 语句从 XML 数据包中选择数据。通过这种方式,您可以使用单个 INSERT 语句插入数百或数千条记录。
我已经使用了循环内的查询和查询内的循环方法。虽然在查询中使用循环理论上更快,但并非总是如此。您必须尝试每种方法,看看哪种方法最适合您的情况。
这是查询内部循环的语法,使用 oracle 来选择数据库。
insert into table
(field1, field2, etc)
select null, null, etc
from dual
where 1 = 2
<cfloop>
union
select <cfqueryparam value="#value1#">
, <cfqueryparam value="#value2#">
etc
from dual
</cfloop>
在<CFQUERY><cfloop>
使用<cfqueryparam>
. 这也是特定于供应商的。如果您不知道将生成多少条记录,最好删除<cfqueryparam>
,如果这样做是安全的。确保您的数据来自受信任的来源并经过消毒。这种方法可以节省大量的处理时间,因为它只调用一次数据库服务器,不像外循环。