Oracle使用游标更新数据 Oracle游标之select for update和where current of 语句

Oracle使用游标更新数据

2016年11月20日 13:15:49 hzwy23 阅读数:5313


友情推广
在这里插入图片描述

###使用游标修改数据

####定义一个游标,游标名称为 mycursor

#####更新scott用户中emp表中empno为7369的销售额

-- Created on 2015/11/30 by ZHANW 
declare 
  he emp%rowtype;
  cursor mycursor(pid integer) is select * from emp where empno = pid for update;
begin
  open mycursor(7369);
  while(true) loop
     fetch mycursor into he; 
     exit when mycursor%notfound;
     update emp set sal = 1111 where current of mycursor;
  end loop;
end;
-- Created on 2015/11/30 by ZHANW 
declare 
  he emp%rowtype;
  cursor mycursor(pid integer) is select * from emp where empno = pid for update;
begin
  open mycursor(7369);
  while(true) loop
     fetch mycursor into he; 
     exit when mycursor%notfound;
     delete from emp where current of mycursor;
  end loop;
end;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

###注意:

delete语句一定要写在exit后面,不然可能会报错。

####优化:

在定义游标时,可以在for update 后面添加 of 字段或者nowait。

https://blog.csdn.net/hzwy23/article/details/53240333

 

 

 

 

Oracle游标之select for update和where current of 语句

2013年06月27日 10:57:09 luckystar2008 阅读数:3150

转载http://hanjiangduqiao.blog.163.com/blog/static/613105442011431111153601

 

使用select for update 语句可以使用行锁锁定你要更改的记录.当遇到下一个commit和rollback语句时会被释放.

The Select For Update statement allows you to lock the records in the cursor result set. You are not required to make changes to the records in order to use this statement. The record locks are released when the next commit or rollback statement is issued.

语法如下:The syntax for the Select For Update is:

CURSOR cursor_name
IS
   select_statement
   FOR UPDATE [of column_list] [NOWAIT];

当你要使用游标进行更新和删除操作时,则需要使用where current of 语句,这个是标示出当前游标的位置.

If you plan on updating or deleting records that have been referenced by a select for update statement, you can use the Where Current Of statement.

 语法如下:The syntax for the Where Current Of statement is either:

UPDATE table_name
    SET set_clause
    WHERE CURRENT OF cursor_name;

OR

DELETE FROM table_name
WHERE CURRENT OF cursor_name;


在这时的例子中我采用上面所建的test表来试验.

2.1 更新.

SQL> DECLARE
  2  CURSOR  test_cur IS SELECT  * FROM test
  3  FOR UPDATE OF sal;
  4  BEGIN
  5  FOR test_rec IN  test_cur LOOP
  6  UPDATE test
  7  SET sal = test_rec.sal +1
  8  WHERE CURRENT OF test_cur;
  9  END LOOP;
 10  COMMIT;
 11  END;
 12  /

PL/SQL 过程已成功完成。

2.2 删除.

SQL> DECLARE
  2  CURSOR test_cur IS select * from test for update;
  3  BEGIN
  4  FOR test_rec IN test_cur LOOP
  5  DELETE FROM test WHERE CURRENT OF test_cur;
  6  END LOOP;
  7  END;
  8  /

PL/SQL 过程已成功完成。

文中的游标只是简单的使用,在记录到pl/sql详细编程的时候会再讲到时会结合oracle的执行计划并一起讨论它们的执行效率.

注:文中的英文注解部分出自:http://www.techonthenet.com/oracle/cursors/current_of.php

https://blog.csdn.net/qincidong/article/details/9185693

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值