免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5380 | 回复: 4
打印 上一主题 下一主题

[原创]PL/SQL的SELECT FOR UPDATE游标 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-25 10:25 |只看该作者 |倒序浏览
在多数情况下,提取循环中所完成的处理都会修改由游标检查出的行,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错误。

论坛徽章:
0
2 [报告]
发表于 2004-03-25 10:26 |只看该作者

[原创]PL/SQL的SELECT FOR UPDATE游标

工作中遇到的问题,查到资料,给大家共享

怎样才能发表原创帖子?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2004-03-25 10:51 |只看该作者

[原创]PL/SQL的SELECT FOR UPDATE游标

[quote="zgahj"]在多数情况下,提取循环中所完成的处理都会修改由游标检查出的行,PL/SQL提供了进行这样处理的一种语法。
这种语法包括两部分——在游标声明部分的FOR UPDATE子句和在UPDATE或DELETE语句中的WHERE CURRENT OF 子句?.........[/quote]


书上有!!!

论坛徽章:
0
4 [报告]
发表于 2004-03-25 13:34 |只看该作者

[原创]PL/SQL的SELECT FOR UPDATE游标

我说过的是查到的资料,我是查的书

论坛徽章:
0
5 [报告]
发表于 2004-03-29 10:11 |只看该作者

[原创]PL/SQL的SELECT FOR UPDATE游标

支持原创。
最好总结多一点放在一起后再加到原创精华。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP