我目前正在将文件中的数据插入表格中。我在将数据插入表格之前格式化数据(删除制表符/回车符/获取某些文本的字符代码等)。 首先,我必须检查记录是否存在,如果存在则更新它。如果它没有必须将该记录插入表中。
我遇到的问题是需要很长时间。我有两个文件,一个低于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;
这可能吗?
我还听说过设置一个临时表并将文件转储到那里,然后在那里工作。这是更好的选择吗?这会给我带来多少性能提升?
我还希望不从文件中对表进行合并。
感谢。
答案 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 ....