zoukankan      html  css  js  c++  java
  • 游标中的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; 
      
      需要注意的是:1、UPDATE语句仅更新在游标声明的FOR UPDATE子句处列出的列。如果没有列出任何列,那么所有的列都可以更新。 
      2、示例中的COMMIT是在提取循环完成以后才完成的,因为COMMIT将释放由该会话持有的所有锁。因为FOR UPDATE子句获得了锁,所以COMMIT将释放这些锁。当锁释放了,该游标就无效了。所以后继的提取操作都将返回ORACLE错误。

    1.这里只记录一些学习笔记 2.这里只记录一些学习心得,如果心得方向有错,请留言 2.这里只记录一些日记(只为提升英语,暂时有点忙,等转行了开始写)
  • 相关阅读:
    elasticsearch数据迁移
    Leetcode <剑指 Offer 64. 求1+2+…+n>
    Leetcode <27.移除元素>
    Leetcode <7.整数反转>
    Leetcode <1. 两数之和>
    python实现对于告警规则的判断思路
    Python实现密码生成器
    Autojs 打包APP+签名
    Docker 文档整理
    Pycharm 连接Linux远程开发
  • 原文地址:https://www.cnblogs.com/liyang31tg/p/3431616.html
Copyright © 2011-2022 走看看