Oracle表删除循环 -

时间:2014-10-05 01:51:39

标签: sql plsql oracle11g sql-delete

我有一个三十方工具,它的存储过程可以从Oracle Tables中删除记录,这些记录采用以下参数从中删除数据

DELETE_TABLE1 UserId, Begin_Date, End_date

我可以控制根据这些参数删除数据来提供这些参数。但是有时由于UNDO空间错误而导致进程失败,因为基于提供的参数,要删除的数据可能会堆积多达1000万或更多。

第三方团队表示他们无法更新存储过程,而是要求控制参数,因此只会输入有限数量的记录。

有没有办法可以控制可以作为参数传递的值,将行限制为50,000,然后将它们作为参数传递给最终存储过程?并在迭代中循环它们?

我可以选择使用Shell脚本来调用第三方存储过程

1 个答案:

答案 0 :(得分:2)

LIMIT行数为DELETED,您必须修改执行DELETE语句的过程。

删除循环中的行是个坏主意。 FOR LOOPROW-BY-ROW aka SLOW-BY-SLOW。所以,要么一次性使用简单SQL,要么使用简单FORALL,然后使用LOOP来避免BULK并在ROWNUM中执行此操作。

关于限制行,每次删除一组行时都可以使用UNDO,提交事务,释放PL/SQL并删除下一组行。

由于您使用的是FORALL,因此最好的方法是将LIMITBULK COLLECT OPEN c_data; LOOP FETCH c_data BULK COLLECT INTO l_tab LIMIT 1000; -- Here you limit the number of rows to be processed EXIT WHEN l_tab.count = 0; END LOOP; CLOSE c_data; 一起使用。

例如:

{{1}}