在Oracle中更新大量行

时间:2009-07-16 14:13:34

标签: c# oracle ado.net

我有这种情况,我正在考虑解决它的最佳方法。我有一个数据库,比如DB-A,有一个表T-A,它有2个字段--OID和PID。这张表有近100万行。现在由于其他一些问题,大多数行的PID被错误地设置为0,这只是在几天之后才发现。

我有两天前的备份,比如DB-B,我正在考虑用DB-B的匹配条目更新DB-A。那么最好的方法是什么呢?我有这个想法:

  1. 创建一个.NET应用程序,该应用程序从DB-B获取行并更新DB-A中的匹配行。不确定这是否会起作用,因为行数很大。可能需要在范围内的事务下进行单独提交。
    1. 创建.NET以从DB-B生成Oracle SQLloader文件并加载到DB-A
  2. 非常感谢您的想法...

    感谢 苏尼特

4 个答案:

答案 0 :(得分:1)

如果您可以构建从DB-A到DB-B的dblink,那么您可以从DB-A执行简单更新:

UPDATE (SELECT ta.pid ta_pid, tb.pid tb_pid
          FROM ta ta
          JOIN ta@backup tb ON (ta.oid = tb.oid))
   SET ta_pid = tb_pid;

如果OID是主键,它将起作用。

答案 1 :(得分:0)

无法将备份加载为(例如)T-B并执行以下查询:

UPDATE T-A, T-B SET T-A.pid = T-B.pid WHERE T-A.oid = T-B.oid

请原谅我的MySQL-ese SQL,但从理论上说它可以工作。

答案 2 :(得分:0)

如果您在DBA.TA和DBB.TB之间有1-1关系,首先我会删除DBA.TA,然后将Asmodon的答案UPDATE更改为INSERT。

如果不可能,我将禁用/删除DBA.TA上的每个约束/索引,执行更新,然后重新启用/创建约束/索引。

问候。

答案 3 :(得分:-2)

可能有一个内置工具,但如果是我,我可能会使用DB-B生成update语句列表,并将它们作为DB-A中的脚本运行。

类似的东西:

select 'update T-A set PID = ' || PID || ' where OID = ' || OID || ';' from T-A

(这假定OID是您的主键。由于您有大量行,您可能需要将其分解为多个脚本。其他人可能能够提供更优雅的解决方案。)