今天在测试程序时,发现了一个我之前不曾注意的问题:rollback会使游标失效!
下面来测试下:
1. 准备2个表
2.程序
DECLARE
i integer;
BEGIN
UPDATE b SET b.id1=11;
FOR v_cur IN (SELECT ID FROM a)
LOOP
IF v_cur.id=2 THEN
ROLLBACK;
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
输出为:
原因分析:
时间点1:进行update操作
时间点2:打开游标
时间点3:rollback
由一致读原理,我们知道游标打开是基于时间点2的一致读,在时间点3回滚,则将数据回滚到时间点1,此时游标必然会失效!
这点很隐蔽,大家开发时要注意。。。。。。