数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

PL/SQL的SELECT FOR UPDATE游标


发布日期:2022年05月21日
 
PL/SQL的SELECT FOR UPDATE游标

在多数情况下提取循环中所完成的处理都会修改由游标检查出的行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;

需要注意的是UPDATE语句仅更新在游标声明的FOR UPDATE子句处列出的列如果没有列出任何列那么所有的列都可以更新

示例中的COMMIT是在提取循环完成以后才完成的因为COMMIT将释放由该会话持有的所有锁因为FOR UPDATE子句获得了锁所以COMMIT将释放这些锁当锁释放了该游标就无效了所以后继的提取操作都将返回ORACLE错误

上一篇:Oracle SQL中实现indexOf和lastIndexOf功能

下一篇:教你设计大型Oracle数据库