我声明了一个游标,从数据库里面查了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;
如果在它正运行的时候我不断把它已经改过去的值又改回来,它会不会一直都结束不了啊?

解决方案 »

  1.   


    也就是说在打开游标时它里面所用到的数据已经存到内存里去了?  如果记录所占的空间很大呢? oracle 会不会进行个什么优化处理到哪部分再去数据库读?
      

  2.   

    你试试  insert into test select * from test就知道了 只会插入一次
      

  3.   

    读到内存去了。。
    它正运行的时候,因为你这里没有commit或rollback,因为oracle对之加了行锁。其他session你改不动对应的记录的。
      

  4.   

    假如mytable 中有5000是'Y' 另外5000为'N' 然后同时开两个cursor,一个不断把'Y'改为'N'并立刻提交,另一个反着来。这样会不会报异常,或结束不了?
      

  5.   

    有提交过,那边改回来了,你要重新open游标才看得到,否则就仍然是你原来select出来的。
    比如记录
    1
    2
    3
    open 游标 for select * 后,1,2,3就不会变了,即使这时候你在另一个session把1改成4并提交,
    这边得到的仍然是1。
      

  6.   

    我看了一下:
    没有加:END LOOP 吧?
      

  7.   

    不会。
    一个开时,所有的Y对应的已经出来了,另一个把N改成Y,这个本来搜Y的不会变化的。