我声明了一个游标,从数据库里面查了10000条记录出来:CURSOR Cur_Push IS
SELECT id,isOk
FROM mytable t;
然后遍历每条记录,改变里面的值:
OPEN Cur_Push;
LOOP FETCH Cur_Push
INTO v_id,v_Ok EXIT WHEN Cur_Push%NOTFOUND; IF(v_Ok='N')THEN
UPDATE mytable
SET isOk ='Y'
WHERE ID =v_id;
END IF;
如果在它正运行的时候我不断把它已经改过去的值又改回来,它会不会一直都结束不了啊?
SELECT id,isOk
FROM mytable t;
然后遍历每条记录,改变里面的值:
OPEN Cur_Push;
LOOP FETCH Cur_Push
INTO v_id,v_Ok EXIT WHEN Cur_Push%NOTFOUND; IF(v_Ok='N')THEN
UPDATE mytable
SET isOk ='Y'
WHERE ID =v_id;
END IF;
如果在它正运行的时候我不断把它已经改过去的值又改回来,它会不会一直都结束不了啊?
也就是说在打开游标时它里面所用到的数据已经存到内存里去了? 如果记录所占的空间很大呢? oracle 会不会进行个什么优化处理到哪部分再去数据库读?
它正运行的时候,因为你这里没有commit或rollback,因为oracle对之加了行锁。其他session你改不动对应的记录的。
比如记录
1
2
3
open 游标 for select * 后,1,2,3就不会变了,即使这时候你在另一个session把1改成4并提交,
这边得到的仍然是1。
没有加:END LOOP 吧?
一个开时,所有的Y对应的已经出来了,另一个把N改成Y,这个本来搜Y的不会变化的。