oracle学习笔记--游标(三)

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。这种情况下,这些数据行仍然是被锁定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值