我有一个结构数组。我需要将该数组中的所有行插入表中。
所以我只是在cfquery
中使用cfloop
来插入数据库。
有些人建议我不要在cfloop中使用cfquery,因为每次它都会与数据库建立新的连接。
但在我的情况下,如果不在cfquery中使用cfloop,我有什么方法可以做到这一点吗?
答案 0 :(得分:2)
与使用'n'请求在cfloop中的每次迭代中插入或更新数据一样,维护连接就像维护连接一样。通过对一些记录的测试,这似乎没问题,但是当你把它投入生产并且你的客户端推动你的应用程序环顾几百行时,那么你将打到几百次的数据库服务器。好。
正如斯科特建议你应该看到循环来构建单个查询而不是数据库的多次命中。在cfquery内部循环有一个好处,你可以使用cfqueryparam,但如果你可以信任数据,即。它已经被清理过了,您可能会发现使用类似cfsavecontent之类的东西来构建查询并在结束时在cfquery中输出字符串会更容易。
答案 1 :(得分:0)
我在查询方法中使用了内部循环和循环查询。虽然在查询中使用循环在理论上更快,但情况并非总是如此。您必须尝试每种方法,看看哪种方法最适合您的情况。
这是循环内部查询的语法,使用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>
答案 2 :(得分:0)
根据数据库的不同,将结构数组转换为XML,然后将其作为单个参数传递给存储过程。
在存储过程中,执行INSERT INTO SELECT,其中SELECT语句从XML数据包中选择数据。您可以通过这种方式使用单个INSERT语句插入数百或数千条记录。
答案 3 :(得分:0)
使用<CFQUERY><cfloop>
时可以执行的<cfqueryparam>
次迭代次数有限制。这也是供应商特定的。如果您不知道要生成多少条记录,最好删除<cfqueryparam>
,如果安全的话。确保您的数据来自可信赖的来源和消毒了。这种方法可以节省大量的处理时间,因为与外部循环不同,它只对数据库服务器进行一次调用。