--PL / SQL - 游标只返回第一行,然后循环结束

时间:2014-03-24 16:52:47

标签: sql oracle plsql

我有一个名为XXALD_INT_IN_VEHICLE_ITEM的表,其中有11行。

我定义了一个游标:

    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行未被提取。

2 个答案:

答案 0 :(得分:1)

你可以在循环外移动提交吗? 我认为它与更新游标冲突。 (更新只存在于一次交易中。)

答案 1 :(得分: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游标自动提交。所以我已经注释掉了提交部分。这会更新满足条件的所有行。