SELECT FOR UPDATE游标
有时需要在游标循环中修改游标提取出的数据行。
这种方法由两部分组成:游标声明中使用FOR UPDATE子句,以及UPDATE或DELETE语句中使用WHERE CURRENT OF 子句。
1、FOR UPDATE
语法:SELECT ..FROM ... FOR UPDATE [OF column_reference][NOWAIT];
其中:column_reference 为所执行查询的表的一列(也可以是一组列)
NOWAIT 若其他会话已经在该活动集的数据行上设置了锁定,则SELECT...FOR UPDATE操作将等待其他会话释放锁定后才能进行操作。如果使用了NOWAIT子句,若出现数据行已经被其他会话锁定的情况,OPEN将会立即返回一个Oracle错误。
2、WHERE CURRENT OF
若使用FOR UPDATE子句声明游标,则WHERE CURRENT OF子句可用于UPDATE或DELETE语句中。语法:
...WHERE CURRENT OF cursor;
其中:cursor 已声明过的游标名(必须使用FOR UPDATE子句中已经声明过)
例子:
--SELECT FOR UPDATE游标,利用游标检索部门编号为30的每一位员工,将工资提供10%。
declare
cursor sal_cursor is
select sal
from emp
where deptno=30
for update of sal nowait;
begin
for emp_record in sal_cursor loop
update emp set sal=emp_record.sal*1.10 where current of sal_cursor;
end loop;
commit;
end;
分析:UPDATE语句中的WHERE CURRENT OF子句引用的是当前提取的记录。
COMMIT是指循环结束之后进行的。这么做是因为COMMIT会释放该会话中拥有的任何锁定,但是FOR UPDATE子句需要锁定,在循环中使用了COMMIT,锁定就被释放,游标也就变得无效,所以后来的其他检索操作都将产生一个Oracle错误。
因此, 不提倡在循环中使用COMMIT,但是若游标没有定义为FOR UPDATE的形式,则不存在这种限制。
注意:可以在定义游标时使用FOR UPDATE子句,而在检索数据行时不使用WHERE CURRENT OF。这种情况下,这些数据行仍然是被锁定的。
oracle学习笔记--游标(三)
最新推荐文章于 2021-04-05 23:10:31 发布