PLSQL中select for update cursor

简介:

开始

复制代码
DECLARE
  CURSOR emp_cursor IS
    SELECT empno, ename, dname
    FROM emp, dept
    WHERE  emp.deptno=dept.deptno
    AND  emp.deptno = 20
    FOR UPDATE OF sal NOWAIT;

  emp_record emp_cursor%ROWTYPE;

BEGIN
   
LOOP

  IF NOT emp_cursor%ISOPEN  THEN
     OPEN emp_cursor;
  END IF; 
  
  FETCH emp_cursor INTO  emp_record; 
  EXIT WHEN emp_cursor%NOTFOUND;
  
  dbms_output.put_line
     ('empno is:' || emp_record.empno || '-- emp name is:' || emp_record.ename ||'-- dept is:' || emp_record.dname);

END LOOP;

IF emp_cursor%ISOPEN  THEN
     dbms_output.put_line('Now to close cursor!');
     CLOSE emp_cursor;
END IF; 

END;
复制代码

当没有其他session 干扰的时候,会有如下的结果:

复制代码
anonymous block completed
empno is:7369-- emp name is:SMITH-- dept is:RESEARCH
empno is:7566-- emp name is:JONES-- dept is:RESEARCH
empno is:7788-- emp name is:SCOTT-- dept is:RESEARCH
empno is:7876-- emp name is:ADAMS-- dept is:RESEARCH
empno is:7902-- emp name is:FORD-- dept is:RESEARCH
Now to close cursor!
复制代码

如果有另外一个session 拿住某些记录(这里是 auto commit off状态,所以是为提交。也就是 在一个隐含的事务里面):

SQL> update emp set ename='XFORD' where deptno=20;

5 rows updated.

SQL> 

然后 保持这种状态,重新来执行,结果是:

复制代码
Error report:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
ORA-06512: at line 3
ORA-06512: at line 16
00054. 00000 -  "resource busy and acquire with NOWAIT specified"
*Cause:    Resource interested is busy.
*Action:   Retry if necessary.
复制代码

如果我们不是用 NOWAIT关键字,会如何?

复制代码
DECLARE
  CURSOR emp_cursor IS
    SELECT empno, ename, dname
    FROM emp, dept
    WHERE  emp.deptno=dept.deptno
    AND  emp.deptno = 20
    FOR UPDATE OF sal;

  emp_record emp_cursor%ROWTYPE;

BEGIN
   
LOOP

  IF NOT emp_cursor%ISOPEN  THEN
     OPEN emp_cursor;
  END IF; 
  
  FETCH emp_cursor INTO  emp_record; 
  EXIT WHEN emp_cursor%NOTFOUND;
  
  dbms_output.put_line
     ('empno is:' || emp_record.empno || '-- emp name is:' || emp_record.ename ||'-- dept is:' || emp_record.dname);

END LOOP;

IF emp_cursor%ISOPEN  THEN
     dbms_output.put_line('Now to close cursor!');
     CLOSE emp_cursor;
END IF; 

END;
复制代码

这个时候再执行,就会一直等待,等待对方释放资源。

结束





本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/11/14/2770274.html,如需转载请自行联系原作者

目录
相关文章
|
SQL XML Java
Mybatis:SQL注入问题 like模糊查询 多表查询 动态SQL
Mybatis:SQL注入问题 like模糊查询 多表查询 动态SQL
2206 0
|
6月前
|
算法 数据可视化 Python
Python中利用遗传算法探索迷宫出路
本文探讨了如何利用Python和遗传算法解决迷宫问题。迷宫建模通过二维数组实现,0表示通路,1为墙壁,'S'和'E'分别代表起点与终点。遗传算法的核心包括个体编码(路径方向序列)、适应度函数(评估路径有效性)、选择、交叉和变异操作。通过迭代优化,算法逐步生成更优路径,最终找到从起点到终点的最佳解决方案。文末还展示了结果可视化方法及遗传算法的应用前景。
152 5
|
10月前
|
数据处理
「Mac畅玩鸿蒙与硬件45」UI互动应用篇22 - 评分统计工具
本篇将带你实现一个评分统计工具,用户可以对多个选项进行评分。应用会实时更新每个选项的评分结果,并统计平均分。这一功能适合用于问卷调查或评分统计的场景。
277 65
「Mac畅玩鸿蒙与硬件45」UI互动应用篇22 - 评分统计工具
|
负载均衡 监控 Dubbo
分布式框架-dubbo
分布式框架-dubbo
|
开发工具 git 开发者
掌握版本控制的艺术:Git 与 GitHub 的高效使用指南
在软件开发中,版本控制对于代码管理和团队协作至关重要。本文详细介绍了 Git 的核心概念与命令,包括初始化、创建仓库、文件跟踪、分支管理和远程仓库操作。同时,探讨了如何利用 GitHub 进行项目组织、代码审查及自动化工作流。通过遵循最佳实践,如频繁提交、清晰的信息记录和合理使用分支,开发者可以提升工作效率和团队协作能力,确保项目的持续成功。
|
编解码 定位技术
【工具分享】如何批量获取图片详细信息,如何把图片的属性信息包括文件路径、文件名、面积尺寸、创建日期、修改日期、水平垂直分辨率、文件大小等图片信息批量提取exel表格中
本文介绍了如何批量提取图片的属性数据到Excel,包括文件名、尺寸、面积、分辨率、GPS信息、创建和修改日期。适合需要处理大量图片信息的工作场景。支持批量导入图片,一键提取各项信息,并能直接导出为表格。
2260 0
|
开发框架 .NET API
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
347 0
|
Android开发
Android笔记: AES解密报错javax.crypto.BadPaddingException: pad block corrupted
Android笔记: AES解密报错javax.crypto.BadPaddingException: pad block corrupted
3035 0
Intellij idea 报错:Error : java 不支持发行版本5
Intellij idea 报错:Error : java 不支持发行版本5
162 0