2014-10-05 50 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;