2014-10-05 2 views
1

을 나는 이러한 주장을주는 제어 할 수 있습니다 그것은Oracle 테이블 루핑 삭제 -

DELETE_TABLE1 UserId, Begin_Date, End_date 

에서 데이터를 삭제 인수 아래에 소요되는 오라클 테이블에서 레코드를 삭제하기 위해 자신의 저장 프로 시저가있는 서른 파티 도구가 이를 기반으로 프로세스가 데이터를 삭제합니다. 그러나 언젠가는 UNDO 공간 오류로 인해 프로세스가 실패합니다. 제공된 인수를 기반으로 삭제할 데이터가 최대 10 백만 개 이상으로 늘어날 수 있기 때문입니다.

제 3자는 팀은 그들이 기록의 제한된 수에 넣어되도록 인수를 제어하기 위해 요청하는 대신 저장 프로 시저를 업데이트 할 수 없습니다 말했다.

내가 그 수의 값을 제어 할 수있는 방법이 50,000 행을 제한하고 마지막 저장된 프로 시저 인수로 전달하는 인수로 전달 될? 반복하여 반복하십시오.

내가 행의 수 DELETEDLIMIT에 저장 프로 시저를 타사에게

+1

만, 그것은 당신의 임의의 한계에 맞는. 그 가시성을 가지고 있는지는 확실하지 않습니다. 타사의 문제 인 것처럼 들리 겠지만 제대로 실행 취소 크기를 조정하거나 범위를 분할하거나 전달할 수있는 범위를 확인하십시오. 대략적인 순서대로 YMMV가 적절합니다. –

답변

2

를 호출 할뿐만 아니라 쉘 스크립트를 사용하는 옵션을 가지고, 당신은 DELETE 문을 실행하는 절차를 수정해야합니다.

루프에서 행을 삭제하는 것은 좋지 않은 생각입니다. A FOR LOOPROW-BY-ROW aka SLOW-BY-SLOW입니다. 따라서 간단하게 SQL을 사용하여 한 번에 수행하고 LOOP을 피하고 BULK에서 수행하려면 FORALL을 사용하십시오.

행 제한과 관련하여 행 집합을 삭제하고 트랜잭션을 커밋하고 UNDO을 릴리스하고 다음 행 집합을 삭제할 때마다 ROWNUM을 사용할 수 있습니다.

PL/SQL을 사용하고 있으므로 가장 좋은 방법은 LIMITBULK COLLECTFORALL을 사용하는 것입니다. 예를 들어

: 당신은 당신이 정말로 제거 할 무엇의 하위 집합입니다 작은 날짜 범위를 얻을 수있는 데이터를 조회 할 수있는 경우

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;