kapok

垃圾桶,嘿嘿,我藏的这么深你们还能找到啊,真牛!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  455 随笔 :: 0 文章 :: 76 评论 :: 0 Trackbacks

在多数情况下,提取循环中所完成的处理都会修改由游标检查出的行,PL/SQL提供了进行这样处理的一种语法。
这种语法包括两部分——在游标声明部分的FOR UPDATE子句和在UPDATE或DELETE语句中的WHERE CURRENT OF 子句。
通常,SELECT操作将不会对正处理的行执行任何锁定设置,这使得连接到该数据库的其他会话可以改变正在选择的数据。
但是,结果集仍然是一致性的。当确定了活动集以后,在执行OPEN的时刻,ORACLE会截取下该表的一个快照。在此时刻以前所提交的任何更改操作都会在活动集中反映出来。在此时刻以后所进行的任何更改操作,即使已经提交了它们,都不会被反映出来,除非将该游标重新打开。但是使用FOR UPDATE子句,在OPEN返回以前的活动集的相应行上会加上互斥锁,这些锁会避免其他的会话对活动集中的行进行更改。直到整个事务被提交为止。

示例:
DECLARE
CURSOR C_CUR IS SELECT * FROM STUDENDS FOR UPDATE OF XM;
BEGIN
OPEN C_CUR;
WHILE C_CUR%FOUND LOOP

UPDATE STUDENDS SET XM='AA'||XM WHERE CURRENT OF C_CUR;

END LOOP;
CLOSE C_CUR;
COMMIT;
END;


需要注意的是:1、UPDATE语句仅更新在游标声明的FOR UPDATE子句处列出的列。如果没有列出任何列,那么所有的列都可以更新。
2、示例中的COMMIT是在提取循环完成以后才完成的,因为COMMIT将释放由该会话持有的所有锁。因为FOR UPDATE子句获得了锁,所以COMMIT将释放这些锁。当锁释放了,该游标就无效了。所以后继的提取操作都将返回ORACLE错误。
posted on 2005-03-08 22:13 笨笨 阅读(3485) 评论(4)  编辑  收藏 所属分类: ALLOracle

评论

# re: oracle的select for update 2006-11-15 13:02 付羽
我是一个中国人,是一个外像的人,想交很多朋友,国外的朋友,只是没要会出国,希望我能如交到朋友.  回复  更多评论
  

# re: oracle的select for update 2007-05-15 11:22 virtualf
不是中国人吧?!
  回复  更多评论
  

# re: oracle的select for update 2007-06-25 09:23 www
他都说了,只是外面像人而已,是一个外像的人  回复  更多评论
  

# re: oracle的select for update 2007-11-06 21:00 sss
我是一个中国人,是一个外像的人,想交很多朋友,国外的朋友,只是没要会出国,希望我能如交到朋友.


一句话里有N多错误,话都不会说还想出国!外像人  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: