2014-03-24 1 views
0

테이블에 XXALD_INT_IN_VEHICLE_ITEM이 있으며 11 개의 행이 있습니다.--PL/SQL - 커서는 첫 번째 행만 반환하고 루프는 끝났습니다.

나는 커서를 정의

CURSOR LINE_VEH IS 
     SELECT * 
     FROM XXALD_INT_IN_VEHICLE_ITEM 
    FOR UPDATE 
     ; 

그때이 선 (ERROR_CODE)의 필드를 업데이트, 하나 하나 선을, 그것을 처리 할 수 ​​있습니다.

OPEN LINE_VEH; 
LOOP 
    FETCH LINE_VEH INTO line; 
     EXIT WHEN LINE_VEH%NOTFOUND; 

    if line.ALD_PROSYS_OR_ATT_N is null then 
     v_error := v_error ||'ALD_PROD_SYSTEM|'; 
    end if; 

    ... 

    update XXALD_INT_IN_VEHICLE_ITEM 
     set ERROR_CODE= v_error 
    where current of LINE_VEH;  
    commit; 

END LOOP; 
CLOSE LINE_VEH; 

문제는 첫 번째 줄만 작성한 후 루프가 끝나는 이유는 무엇입니까? 다른 10 개의 행은 반입되지 않습니다.

답변

1

루프 밖에서 커밋을 이동할 수 있습니까? for update 커서와 충돌한다고 생각합니다. (업데이트를 위해 하나의 트랜잭션에 살고있다.) UPDATE 커서에 대한

+0

감사합니다. 매우 도움이되었습니다 –

0
CREATE TABLE EMP AS 
SELECT * FROM EMPLOYEES WHERE ROWNUM <=11; 
COMMIT; 
SELECT * FROM EMP; 


    DECLARE 
    CURSOR LINE_VEH 
    IS 
    SELECT * FROM EMP FOR UPDATE; 
    line LINE_VEH%ROWTYPE; 
    v_error NUMBER; 
    --I take the lines one by one, and handle it, then update a field of this line(error_code). 
BEGIN 
    OPEN LINE_VEH; 
    LOOP 
    FETCH LINE_VEH INTO line; 
    EXIT WHEN LINE_VEH%NOTFOUND; 
    IF line.DEPARTMENT_ID =200 THEN 
     v_error    := 300; 
    END IF; 
    UPDATE EMP SET DEPARTMENT_ID= v_error WHERE CURRENT OF LINE_VEH; 
    --COMMIT; 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT); 
END; 

/

는 autometically 커밋합니다. 그래서 커밋 부분을 주석 처리했습니다. 조건을 만족하는 모든 행을 업데이트합니다.

+0

고마워요 !!!! –

관련 문제