2014-12-05 11 views
0

사실 저는 1000 개의 레코드를 업데이트하려고하는데 5000 개의 레코드마다 커밋을하고 있습니다. 하지만 난 위의 오류가 내가 VARRAY에 한계로 인해 얻을. 100k 키 값을 배열로 저장하는 경우에도 배열 데이터 유형에 대한 대안을 제공해주십시오! 아래 코드 샘플.ORA-06532 : 한계 밖의 첨자

DECLARE 
v_initial number(6):=0; 
v_final number(6):=5000; 
-- TOtal number of records V_COUNT 
type lnum IS VARRAY(1000) OF INTEGER; -- change total number of records 
iid lnum; 
v_maxnum number(8):=0; 

BEGIN 

iid:=lnum(); -- here 1000 values will be given 

v_maxnum := iid.count; 
FOR i in v_initial..v_maxnum LOOP 

    UPDATE table SET status='E' WHERE pkey=iid(i); 

    IF i=v_final THEN 
     COMMIT; 
     v_initial:=v_final+1; 
     v_final:=v_final+5000; 
END IF; 
IF i=v_maxnum THEN 
     commit; 
END IF; 

    EXIT WHEN i= v_maxnum; 


END LOOP; 


END; 
/

답변

0

v_initial을 0 대신 1로 초기화합니다. Varray 인덱스는 1부터 시작합니다.

또한, 여기 당신이 간단하게하기 위해 고려할 수있는 모든 X의 기록을 저지르고 또 다른 기술이다 :

commit_count_const CONSTANT number := 5000; -- commit every 5000 
v_loop_counter := 0  
... 
FOR i in... 
    UPDATE... 

    v_loop_counter := v_loop_counter + 1;  -- Increment counter 

    -- If the remainder of the counter divided by commit_count_const is 0, 
    -- then we hit a multiple of the commit_count so commit. 
    IF MOD(v_loop_counter, commit_count_const) = 0 THEN 
    COMMIT; 
    end if; 
... 
END LOOP; 

COMMIT; -- commit to catch the rows updated since the last commit. 
... 

오와 오류 처리를 추가하는 것을 잊지 마세요, COMMIT 무엇 UPDATE 경우 또는 실패?