有什么比制作850+ UPDATE语句更好的方法吗?

我在Excel VBA中创build了一些东西,我需要从Excel表格中读取850行或更多的行,并在Oracle 11g中的现有表中更新它们。 幸运的是,只有2列对我感兴趣。

唯一的方法,我目前正在做的事情只是循环通过在Excel中的范围,并创build一个单一的UPDATE myTable SET Temp = Array(i, 2) WHERE id = Array(i,1)为数组中的每个字段。

现在…我很清楚,这不是更快,也不优雅,这就是为什么我正在寻找提示和技巧来优化这样的事情。

我非常感谢提供的每一个提示。

=== UPDATE ===

在通过制作临时表来testingKacpers的build议后,结果是在使用Excel列表时,如果我对2列(约850行)感兴趣,则需要大约2分钟的时间才能读取数据,并使用INSERT ALL方法将其写入表中插入。
另一个表格和excel文件大约有970行和3列,而过滤掉了我写了大约700行,大约一分钟就完成了。

最后一部分是结合现有的表格,而这个实施之前的过程需要大约35秒,现在需要45-55秒。

这仍然是一个非常缓慢的方法。 特别是插入部分。
就像我在评论中所说的,我没有访问服务器存储系统的权限,所以上传或制作CSV导入数据不是一种select。

仍然非常感谢任何提示或提示我可以用来优化程序。

首先请将您的excel导入到表格中,或者根据xls文件中的csv数据创build外部表格。 比方说,你将数据导入到表t1与列C1,C2

然后你可以执行合并操作:

 merge into myTable mt using t1 on (mt.id = t1.c1) when matched then update set Temp = c2; 

在这里你可以额外的when not matched then insert如果你需要插入myTable中不存在的行;

你应该使用这样的绑定variables准备好的语句(未testing):

 Set cmd = CreateObject("ADODB.Command") Set cmd.ActiveConnection = con ' your "ADODB.Connection" object cmd.CommandType = adCmdText cmd.CommandText = "UPDATE myTable SET Temp = ? WHERE id = ?" cmd.Parameters.Append cmd.CreateParameter("newVal", adVarChar, adParamInput, 10) cmd.Parameters.Append cmd.CreateParameter("id", adBigInt, adParamInput) con.BeginTrans For i = 1 To 850 cmd.Parameters("newVal").Value = Array(i, 2) cmd.Parameters("id").Value = Array(i, 1) cmd.Execute Next con.CommitTrans 

重要提示: cmd.Parameters.Append只能在循环外完成一次。 否则,你将无法获得任何东西。

它很可能不会像Direct-Path INSERT(即一个外部表)那么快,但性能应该足够了。

好的,所以我已经使用了Kacperbuild议的一半解决scheme,这意味着我引入了一个临时表,我已经填充了第一个使用~850 INSERT的内容: INSERT ALL INSERT ... END然而,解决scheme需要大约1- 2分钟执行。

另一个话题build议我“连接”我的数据到一个单一的插入命令,并只执行一次。
这似乎是最有效的方法,所以我的插入目前看起来像:

 INSERT INTO myTempTable (id, temp) SELECT 'data1', 'data2' from dual UNION ALL SELECT 'data3', 'data4' from dual UNION ALL SELECT 'data5', 'data6' from dual ... 

结果只花费了大约一秒来执行全部850个插入,并且通过平均join大约5秒来延长myTable的更新。

感谢大家的参与,并提供您提供的有用提示!