2014-03-24 108 views
0

我有一個名爲XXALD_INT_IN_VEHICLE_ITEM的表,其中有11行。--PL/SQL - 遊標只返回第一行,然後循環結束

我定義遊標:

CURSOR LINE_VEH IS 
     SELECT * 
     FROM XXALD_INT_IN_VEHICLE_ITEM 
    FOR UPDATE 
     ; 

我走線一個接一個,並且處理它,然後更新該行(錯誤代碼)的一個字段。

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; 

問題是,爲什麼只有第一行的traitement後,循環結束? 其他10行不提取。

回答

1

你可以在循環之外移動提交嗎? 我認爲它與更新遊標衝突。 (用於更新只住在一個事務中。)

+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; 

/

FOR UPDATE光標autometically提交。所以我已經評論了提交部分。這將更新滿足條件的所有行。

+0

非常感謝!!!! –