我有一个三十方工具,它的存储过程可以从Oracle Tables中删除记录,这些记录采用以下参数从中删除数据
DELETE_TABLE1 UserId, Begin_Date, End_date
我可以控制根据这些参数删除数据来提供这些参数。但是有时由于UNDO空间错误而导致进程失败,因为基于提供的参数,要删除的数据可能会堆积多达1000万或更多。
第三方团队表示他们无法更新存储过程,而是要求控制参数,因此只会输入有限数量的记录。
有没有办法可以控制可以作为参数传递的值,将行限制为50,000,然后将它们作为参数传递给最终存储过程?并在迭代中循环它们?
我可以选择使用Shell脚本来调用第三方存储过程
答案 0 :(得分:2)
要LIMIT
行数为DELETED
,您必须修改执行DELETE
语句的过程。
删除循环中的行是个坏主意。 FOR LOOP
是ROW-BY-ROW aka SLOW-BY-SLOW
。所以,要么一次性使用简单SQL
,要么使用简单FORALL
,然后使用LOOP
来避免BULK
并在ROWNUM
中执行此操作。
关于限制行,每次删除一组行时都可以使用UNDO
,提交事务,释放PL/SQL
并删除下一组行。
由于您使用的是FORALL
,因此最好的方法是将LIMIT
与BULK 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}}