设为首页 收藏本站
查看: 1003|回复: 0

[经验分享] (转)oracle.for update,更新游标,cursor

[复制链接]

尚未签到

发表于 2016-7-26 10:15:53 | 显示全部楼层 |阅读模式
  http://blog.csdn.net/yanleigis/article/details/2950208
oracle dml select for update syntax examples
在多数情况下,提取循环中所完成的处理都会修改由游标检查出的行,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子句处列出的列(这句话有错误,经试验和查询证明,UPDATE语句可以更新游标声明的FOR UPDATE中涉及到的表的所有列)。如果没有列出任何列,那么所有的列都可以更新。 
2、示例中的COMMIT是在提取循环完成以后才完成的,因为COMMIT将释放由该会话持有的所有锁。因为FOR UPDATE子句获得了锁,所以COMMIT将释放这些锁。当锁释放了,该游标就无效了。所以后继的提取操作都将返回ORACLE错误。
Oracle 10g使用游标更新或删除数据
  http://zheng12tian.iyunv.com/blog/815770

在定义又表示必须要带有for update子句,用于在游标结果集数据上加行共享锁,以防止其他用户在相应行上执行dml操作;当select语句引用到多张表时,使用of子句可以确定哪些表要加锁,如果没有of子句,则会在select语句所引用的全部表上加锁;nowait子句用于指定不等待锁。在提取了游标数据之后,为了更新或删除当前游标行数据,必须在update或delete语句中引用where current of 子句。 
--1、使用游标更新数据 
Java代码   DSC0000.png


  • declare  
  • cursor emp_cursor is  
  • --加行共享锁  
  • select t.name,t.english_name from communitytype t for update;  
  • --定义变量  
  • v_name communitytype.name%type;  
  • v_enname communitytype.english_name%type;  
  • begin  
  • --打开游标  
  • open emp_cursor;  
  • loop  
  • fetch emp_cursor into v_name,v_enname;  
  • exit when emp_cursor%notfound;  
  • if v_name = '电子图书' then  
  • update communitytype c  
  • set c.english_name = 'ebook'  
  • where current of emp_cursor;  
  • end if;  
  • end loop;  
  • close emp_cursor;  
  • commit;  
  • end;  


--2、使用游标删除数据,同上只需要将更新语句换成删除语句 
--3、使用of子句在特定表上加行共享锁 
Java代码  


  • declare  
  • cursor emp_cursor is  
  • --加行共享锁  
  • select t.name,t.english_name from communitytype t for update of t.name;  
  • --定义基于游标的记录变量  
  • emp_record emp_cursor%rowtype;  
  • begin  
  • --打开游标  
  • open emp_cursor;  
  • loop  
  • fetch emp_cursor into emp_record;  
  • exit when emp_cursor%notfound;  
  • if emp_record.name = '电子图书' then  
  • update communitytype c  
  • set c.english_name = 'ebook'  
  • where current of emp_cursor;  
  • end if;  
  • end loop;  
  • close emp_cursor;  
  • commit;  
  • end;  


--4、默认情况下当前会话要一直等待对方释放锁,使用nowait子句可以避免等待锁 
Java代码  


  • declare  
  • cursor emp_cursor is  
  • --加行共享锁  
  • select t.name,t.english_name from communitytype t for update nowait;  
  • --定义基于游标的记录变量  
  • emp_record emp_cursor%rowtype;  
  • begin  
  • --打开游标  
  • open emp_cursor;  
  • loop  
  • fetch emp_cursor into emp_record;  
  • exit when emp_cursor%notfound;  
  • if emp_record.name = '电子图书' then  
  • update communitytype c  
  • set c.english_name = 'ebook'  
  • where current of emp_cursor;  
  • end if;  
  • end loop;  
  • close emp_cursor;  
  • commit;  
  • end;  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249542-1-1.html 上篇帖子: ORACLE 各种PARTITION 的分析(原) 下篇帖子: [Oracle] 统计信息和dbms_stats包
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表