博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PLSQL中select for update cursor
阅读量:6194 次
发布时间:2019-06-21

本文共 2104 字,大约阅读时间需要 7 分钟。

开始

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 completedempno is:7369-- emp name is:SMITH-- dept is:RESEARCHempno is:7566-- emp name is:JONES-- dept is:RESEARCHempno is:7788-- emp name is:SCOTT-- dept is:RESEARCHempno is:7876-- emp name is:ADAMS-- dept is:RESEARCHempno is:7902-- emp name is:FORD-- dept is:RESEARCHNow 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 expiredORA-06512: at line 3ORA-06512: at line 1600054. 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,如需转载请自行联系原作者

你可能感兴趣的文章
【技术维新 践行精彩】移动互联时代的研发利器
查看>>
『中级篇』容器编排Docker Swarm介绍(42)
查看>>
交换机级联
查看>>
当类的成员变量为字符串的时候,注意深拷贝
查看>>
Linux 新手容易犯的 7 个错误
查看>>
connect解析
查看>>
跨域CORS
查看>>
Python -- 多进程
查看>>
关于Linux库函数int system(const char *command);
查看>>
PHPl链接数据库
查看>>
HTML5和CSS3简单介绍
查看>>
获得Python脚本所在目录
查看>>
工具类——自定义Collections集合方法
查看>>
liunx系统 修改tab键长度
查看>>
swap
查看>>
w命令 vmstat命令 top命令 sar命令 nload命令
查看>>
nginx+tomcat均衡负载、反向代理
查看>>
springcloud 组件关系图
查看>>
EonStor GSc:企业云文件共享的利器
查看>>
userdel的简单用法
查看>>