Oracle12C--修改游标数据(三十七)

知识点的梳理:

  • 游标的事务主要依靠"FOR UPDATE"子句与"WHERE CURRENT OF"子句;
  • "WHERE CURRENT OF"子句的原理基于ROWID的概念,在更新或删除游标数据的时候,可以利用此子句定位数据行。而此子句的创建必须存在有FOR UPDATE子句,否则无法使用;

  

  • FOR UPDATE子句
    • 创建的游标在执行更新或删除的操作时,必须带有FOR UPDATE子句;
      • 该子句会将游标提取出来的数据进行行级锁定,这样在本会话更新期间,其他用户的会话就不能对当前游标中的数据行进行更新操作;
    • FOR UPDATE子句有两种使用形式:
      • FOR UPDATE [OF ,...]:为游标中的数据增加行级锁定,当游标更新时,其他用户的会话将无法更新指定数据;
        • 示例1:为游标数据增加行级锁

CURSOR cur_emp IS SELECT * FROM emp WHERE deptno=10 FOR UPDATE OF sal,comm. ;

  • FOR UPDATE NOWAIT子句:
    • 在Oracle中,所有的事务都具备隔离性,当一个用户会话更新数据且事务未提交时,其他用户会话是无法对数据进行更新的。如果此时执行游标数据的更新操作,就会进入死锁状态;
    • FOR UPDATE NOWAIT子句可以避免游标死锁状态;
    • 示例1:创建不等待游标

DECLARE

CURSOR cur_emp IS SELECT * FROM emp WHERE deptno=10 FOR UPDATE NOWAIT;

BEGIN

FOR emp_row IN cur_emp LOOP

UPDATE emp SET sal=9999 WHERE empno=emp_row.empno ;

END LOOP ;

END ;

/

验证此游标:
1.启动一个SQLplusSQL Developer窗口;
2.执行更新操作:"update emp set sal = 6666.comm = 3000 where deptno =10;",但不使用COMMIT提交或ROLLBACK回滚数据,此时其他的用户会话无法更新这些数据;
3.启动另外一个SQLPlus或SQL Developer窗口,执行以上的游标操作程序,会出现以下提示信息:

  • WHERE CURRENT OF子句
    • 使用FOR UPDATE语句锁定数据行之后,可以直接利用WHERE CURRENT OF子句进行当前行的更新或删除操作,语法:

WHERE CURRENT OF 游标名称

  • 示例1:使用WHERE CURRENT OF子句

DECLARE

CURSOR cur_emp IS SELECT * FROM emp WHERE deptno=10 FOR UPDATE OF sal,comm ;

BEGIN

FOR emp_row IN cur_emp LOOP

UPDATE emp SET sal=9999 WHERE CURRENT OF cur_emp ;

END LOOP ;

END ;

/

分析:
本程序对游标中的数据进行更新操作,在更新数据时,
WHERE子句使用了CURRENT OF cur_emp,表示更新当前游标行的数据

  • 示例2:使用游标删除数据

DECLARE

CURSOR cur_emp IS SELECT * FROM emp WHERE deptno=10 FOR UPDATE OF sal, comm ;

BEGIN

FOR emp_row IN cur_emp LOOP

DELETE FROM emp WHERE CURRENT OF cur_emp ;

END LOOP ;

END ;

/

你可能感兴趣的:(Oracle,Oracle12c学习笔记)