目前我的代码框架如下:
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 。
答案 0 :(得分:-2)
听起来问题是您必须删除数百万行,因此您希望在baches中执行此操作
如果是这样,这可能对您有用 - 它将循环并删除行并提交,以便您不会用完撤消而且您不必担心锁定行
begin
loop
delete from xx where yyy=zzz and rownum < 1000;
exit when sql%rowcount = 0;
commit;
end loop;
commit;
end;
/