2011-03-09 4 views
1

PL/SQL forall 루프가 특정 간격으로 자동으로 커밋되거나 루프 이후에 커밋해야합니까?PL/SQL에서 forall 루프를 실행할 때 나중에 커밋해야합니까?

오라클 10g 및 11g

FORALL i IN x.FIRST .. x.LAST 
    delete from table where 1=1; 

나는 현재 대량 수집 않는 PL/SQL 스크립트를 가지고, 다음 컬렉션을 반복 루프 FORALL 3 가지 실행했습니다. 현재 forall 루프가 완료된 후 스크립트의 commit 문을 사용하여 커밋을하고 있습니다. 필요한 것인가? 특히 컬렉션에 수백만 항목이있을 때 실행 속도가 느려 집니까?

감사합니다.

답변

3

FORALL 문은 표준 DML이며 개별 구문의 일괄 처리입니다. 따라서 커밋해야하는지 결정하기위한 표준 규칙을 따라야합니다. 일관성있는 상태를 달성했을 때 트랜잭션의 끝에서 커밋하십시오.

개별적으로 취해진 각 명령문이 단일 트랜잭션 인 경우를 제외하고는 3 개의 FORALL 문이있는 경우 3 회 커밋 할 이유가 없습니다.

첫 번째 FORALL 문 다음에 작업이 실패하면 이 아직 완료되지 않은 경우 다시 시작하는 것이 훨씬 쉬워집니다.이 아직 완료되지 않았습니다.

4

FORALL 후에 명시 적으로 커밋해야합니다. 결국, FORALL을 사용하여 고속 DML을 수행하고 있으며, DML이 자동으로 커밋하지 않는다는 것을 알고 있어야합니다.

또한 hough FORALL은 컬렉션의 모든 행을 반복하며 루프가 아니며 문입니다. LOOP 또는 END LOOP 문은 없습니다.

+2

나는 당신이 당신의 대답에서 말하는 모든 것에 동의하지만 나는 그 질문에 완전히 대답하지 않는다고 생각합니다. FORALL 문 다음에 커밋하는 것은 필수적인 것은 아닙니다. 나중에 커밋 할 수 있으며 트랜잭션이 끝나기 전에 커밋하지 않아야합니다. –

+0

+1 "FORALL is a loop" –

관련 문제