批量插入并同时更新和更新

时间:2015-01-26 12:59:41

标签: database oracle plsql bulkinsert bulkupdate

我目前正在将文件中的数据插入表格中。我在将数据插入表格之前格式化数据(删除制表符/回车符/获取某些文本的字符代码等)。 首先,我必须检查记录是否存在,如果存在则更新它。如果它没有必须将该记录插入表中。

我遇到的问题是需要很长时间。我有两个文件,一个低于500k记录,一个高于4mil。如果可以运行批量收集以便我同时执行这两种操作?

E.G。

open c_cur;
loop
  fetch c_cur bulk collect into examp limit 50000;
  exit when limit.count = 0
  forall x in 1..limit.count
    update table1
    set...
    where...

    if sql%notfound then
      insert into table1
      values (...)
    end if;
  commit;
end loop;
close c_cur;

这可能吗?

我还听说过设置一个临时表并将文件转储到那里,然后在那里工作。这是更好的选择吗?这会给我带来多少性能提升?

我还希望不从文件中对表进行合并。

感谢。

2 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是根据文件设置外部表(您必须确保数据库服务器可以查看存储文件的目录)。这样,您就可以直接对外部表格执行MERGE语句(不需要批量收集等;这仍然是逐行的方法,即使它稍微有点效率)

下一个最好的(恕我直言)是将文件中的数据加载到临时表中,然后根据登台表执行合并语句。

答案 1 :(得分:0)

您可以使用sql%bulk_rowcount

--after forall update:
for i in 1..examp.count loop
  if sql%bulk_rowcount(i) > 0 then
    examp.delete(i); -- record already updated - remove it from array
  end if;
end if;

-- loop only non-deleted elements here
forall i in indicies of examp
  insert into ....