1、参数化的游标作用:多次打开相同的游标,返回不同的结果集。游标声明部分的形参必须与OPEN语句中提供的实参相对应(数量与数据类型)。

例1:

DECLARE

v_empno emp1.empno%TYPE;

v_ename

emp1.ename%TYPE;

CURSOR emp_cursor

(p_deptno NUMBER, p_job VARCHAR2)

IS      ——定义参数时不需要指定精度

SELECT empno, ename

FROM emp1

WHERE deptno=p_deptno

AND job=p_job;

BEGIN

OPEN

emp_cursor(30,'SALESMAN');  ——带参数使用的游标

LOOP

FETCH emp_cursor INTO

v_empno, v_ename;

EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS

NULL;

DBMS_OUTPUT.PUT_LINE('empno is  '||v_empno||'  and '||'  ename is

'||v_ename);

END LOOP;

CLOSE emp_cursor;

END;

2、记录+FOR+游标参数

DECLARE

CURSOR emp_c (p_job VARCHAR2)

IS SELECT ename, sal FROM

emp

WHERE job=p_job FOR UPDATE NOWAIT;

BEGIN

FOR e_record IN

emp_c(UPPER('&jobs'))         ——使用替代变量

LOOP

dbms_output.put_line(e_record.ename||'''s sal:'||e_record.sal);

END

LOOP;

END;

/

Enter value for jobs: manager

old   6:   for e_record in

emp_c(upper('&jobs'))

new   6:   for e_record in

emp_c(upper('manager'))

JONES's sal:2975

BLAKE's sal:2850

CLARK's

sal:2450

3、SELECT FOR UPDATE 游标

通常,SELECT语句不会在被访问的数据行上设置任何锁定,这允许连接到该数据库的其他会话可以改变被选择的数据。

然而结果集是一致的,因为在OPEN阶段,活动集被确定后,oracle做了个快照,在此之后发生的变化不会反映到结果集里,除非再一次打开游标。

可以使用FOR

UPDATE子句在活动集的数据行上设置独占行锁定,直到该事务结束。

例:

DECLARE

v_empno emp.empno%TYPE;

v_ename

emp.ename%TYPE;--------定义变量

CURSOR emp_cursor IS

SELECT empno, ename

FROM emp1

FOR UPDATE NOWAIT;

--NOWAIT 如果数据行已经被其他事务锁定,OPEN将会返回一个错误

--returns an Oracle error if the

rows are locked by another session

--也可以写成FOR UPDATE OF sal

NOWAIT,只锁定sal列。BEGIN

OPEN emp_cursor;

IF emp_cursor%ISOPEN

THEN

LOOP

FETCH emp_cursor INTO v_empno, v_ename;

EXIT WHEN emp_cursor%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('Empno is

'||v_empno||' and ename is '||v_ename);

END LOOP;

DBMS_OUTPUT.PUT_LINE(emp_cursor%ROWCOUNT);

END IF;

CLOSE

emp_cursor;

END;

模拟锁定:update emp1 set ename='SMMTH' where empno=7369;

查看系统当前锁(sys)

select oracle_username, os_user_name,session_id from

v$locked_object;

update emp1 set ename='SMMTH' where empno=7369;(会话不成功)

3、WHERE CURRENT OF子句

引用显式游标的当前行,(如果游标定义时使用了FOR UPDATE的话)

DECLARE

CURSOR e_sal_cursor IS

SELECT sal FROM emp WHERE

deptno=&&DEPTNO

FOR UPDATE NOWAIT;

BEGIN

FOR r IN

e_sal_cursor LOOP

UPDATE emp SET sal=sal*1.1

WHERE CURRENT OF

e_sal_cursor;

END LOOP;

END;

/

错误的方式:DECLARE

CURSOR

e_sal_cursor IS

SELECT sal FROM emp WHERE deptno=&&DEPTNO

FOR UPDATE NOWAIT;

BEGIN

OPEN e_sal_cursor;

FOR r IN

1..e_sal_cursor%ROWCOUNT LOOP

UPDATE emp SET sal=sal*1.1

WHERE

CURRENT OF e_sal_cursor;

END LOOP;

CLOSE

e_sal_cursor;

END;

/

例子2

1  declare

2    cursor emp_c is

3      select * from emp1

where empno=&eno

4    for update;

5  begin

6    for r in

emp_c loop

7      update emp1 set sal=sal*1.1

8      where current of

emp_c;   ——表示使用当前游标值

——where

empno=&eno,效果和上面的一样,但是这表示再打开一个游标,这使系统负载变大  9

dbms_output.put_line(r.ename||'''s sal is'||r.sal);

10    end loop;

11*

end;

SQL> /

Enter value for eno: 7788

old   3:     select * from

emp1 where empno=&eno

new   3:     select * from emp1 where

empno=7788

SCOTT's sal is3630

oracle显性游标,Oracle高级显式游标的使用相关推荐

  1. Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

  2. oracle 游标内存自动释放,详解Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

  3. oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...

    1.概述 上文PLSQL学习中提到的知识,可以发现,基本都可以通过Java等语言实现,而为了实现程序的可移植性,实际开发工作中我们也是如此做的. 那么PLSQL的重点是什么呢?接下来我们来介绍游标cu ...

  4. Oracle 11g Release 1 (11.1) 游标——显式游标

    http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/static.htm#CIHCAHJA 本文内容 声明一个游标 打开一个游标 用游标获取一个 ...

  5. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

  6. Oracle入门(十四.10)之显式游标简介

    一.上下文区域和游标 Oracle服务器分配一个称为上下文区域的私有内存区域来存储由SQL语句处理的数据. 每个上下文区域(因此每个SQL语句)都有一个与其关联的游标.您可以将游标视为上下文区域的标签 ...

  7. Oracle显式游标和隐式游标

    游标的概念: 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处 ...

  8. Oracle入门(十四.11)之使用显式游标属性

    一.游标和记录 此示例中的游标基于SELECT语句,该语句仅检索每个表行的两列. 如果它检索了六列或七,八,二十个呢? DECLAREv_emp_id employees.employee_id%TY ...

  9. Oracle 游标遍历 显式游标 静态游标 OPEN v_cur(); WHILE v_cur%FOUND LOOP; LOOP FETCH v_cur INTO v_row

    -- Created on 2018/11/6 by YXQ  --显示游标 & 静态游标的处理 declare      --定义(游标一个可以遍历的结果集)      --声明cursor ...

最新文章

  1. Worker启动Executor源码
  2. Codeforces 797C Minimal string【贪心】
  3. jquery在当前页面打印页面div内容实例
  4. Echarts 地理信息可视化:基于地图显示坐标点信息
  5. linux进程管道通信缺点,Linux进程通信(IPC)的方式详解
  6. postgresql 增量备份
  7. 用SPFA判断是否存在负环
  8. [转]DataGridView显示行号的几种方法
  9. 【Python学习笔记】集合set
  10. 树莓派人脸打卡机(考勤机)(Python)
  11. W ndows7蓝屏0x00000024,Win7开机蓝屏报错0x00000024如何解决?
  12. Google Earth Engine(GEE)——估计未来人口密度(越南2100年人口预测)
  13. 从Darry Ring看奢侈品该如何玩转互联网思维
  14. 虚拟机soft lockup CPU死锁问题
  15. 什么是进程、进程的概念?
  16. 张宇考研数学闭关修炼【解析分册】
  17. 你不可不知的《哈利波特》秘密(四)
  18. 【小波滤波】基于小波变换的噪声信号滤波处理matlab仿真
  19. 2017年阿里Java面试基础题
  20. Python识别红绿灯代码

热门文章

  1. python3 issubset 判断列表子集
  2. php global变量无效
  3. php文件之间相互引用路径问题的一般处理方法
  4. API读取写入 ini文件内容的方法函数详解
  5. java中Error与Exception有什么区别
  6. AWS无服务开发Lambda系列之本地上传包至Lambda
  7. 新一代 Linux 文件系统 btrfs 简介
  8. 分屏显示_王者做图显示器,戴尔(DELL)U2417全面介绍
  9. qt中label画圆代表指示灯_【Qt编程】基于QWT的曲线绘制及图例显示操作——有样点的实现功能...
  10. mysql的雪崩穿透_缓存穿透、缓存击穿和缓存雪崩实践