2014-10-05 53 views
1

我有一个三十党的工具,都有自己的存储过程从Oracle表这需要下面的参数从中Oracle表删除循环 -

DELETE_TABLE1 UserId, Begin_Date, End_date 

我有控制给这些参数删除数据删除记录基于此过程删除数据。但有时由于UNDO空间错误导致进程失败,因为根据提供的参数,要删除的数据可能会高达1000万甚至更多。

第三方团队说,他们不能更新存储的程序,而他们正在请求控制参数,因此被放在只有有限的记录数。

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

我必须使用的shell脚本调用第三方存储过程

+1

只有当你可以查询数据得到那个是你真正想要删除的子集较小的日期范围,适合到您的任何限制。目前还不清楚你是否有这种可见度。听起来这是第三方的问题,但要正确地缩小范围,自己分割范围,或者验证允许范围 - 以大致递减的适当顺序,但是YMMV。 – 2014-10-05 09:23:17

回答

2

LIMIT行数是DELETED一个选项,则必须要修改其中执行DELETE语句的过程。

删除循环中的行是一个坏主意。 A FOR LOOP,是ROW-BY-ROW aka SLOW-BY-SLOW。因此,要么一次使用简单SQL,如果不是,则使用FORALL来避免LOOP,并在BULK中执行此操作。

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

由于您使用的是PL/SQL,最好的方法是使用FORALLLIMITBULK 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;