目前我的代码框架如下所示:
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;
释放锁以及我批量删除非常重要,因为有数百万条记录,推进建议的解决方案似乎存在挑战。
请告知是否有更好的选择。提前谢谢。
参考我之前的问题:链接
请注意,整个过程发生在oracle-pro-c中。
听起来问题是您必须删除数百万行,因此您希望以巴赫为单位进行
如果是这样,这可能对您有用 - 它将遍历并删除行并提交,这样您就不会用完撤消,也不必担心锁定行
begin
loop
delete from xx where yyy=zzz and rownum < 1000;
exit when sql%rowcount = 0;
commit;
end loop;
commit;
end;
/