目前,我的代码骨架如下所示:
varchar rowidvariable[batchlimitcount][19];
stmt = "Select rowid from table_name where xx"
delstmt = "delete from table_name where rowid=:rowidvariable"
prepare delstatement using delstmt;
prepare cursor from stmt;
declare cursor from preparecursor;
open cursor;
while(1)
{
fetch cursor into rowidvariable;
somecondition {break};
exec sql for fetchedCount
execute delstatement using :rowidvariable;
commit;
} 有人向我指出,使用SELECT FOR UPADATE锁定表将是确保100%地锁定行的方法,而且在任何情况下(无论机会多么小),ROWID都不会被更改。
然而,由于commit;释放锁,而且由于有数以百万计的记录,所以我要批量删除它是非常重要的,因此在推进所提出的解决方案方面似乎存在挑战。
如果有更好的选择,请告知。提前谢谢。
参考我先前的问题:Link
注意,整个过程发生在oracle-pro-c中。
发布于 2018-05-30 17:13:35
听起来问题是你必须删除数百万行,所以你想要用缓存来做。
如果是这样的话,这可能适用于您--它将循环遍历、删除行并提交,这样您就不会耗尽撤销,并且不必担心锁定行。
begin
loop
delete from xx where yyy=zzz and rownum < 1000;
exit when sql%rowcount = 0;
commit;
end loop;
commit;
end;
/https://stackoverflow.com/questions/50608708
复制相似问题