我有一个名为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行未被提取。
答案 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游标自动提交。所以我已经注释掉了提交部分。这会更新满足条件的所有行。