oracle显性游标,Oracle高级显式游标的使用
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高级显式游标的使用相关推荐
- Oracle隐式游标和显式游标
游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...
- oracle 游标内存自动释放,详解Oracle隐式游标和显式游标
游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...
- oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...
1.概述 上文PLSQL学习中提到的知识,可以发现,基本都可以通过Java等语言实现,而为了实现程序的可移植性,实际开发工作中我们也是如此做的. 那么PLSQL的重点是什么呢?接下来我们来介绍游标cu ...
- Oracle 11g Release 1 (11.1) 游标——显式游标
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/static.htm#CIHCAHJA 本文内容 声明一个游标 打开一个游标 用游标获取一个 ...
- 【Oracle】PL/SQL 显式游标、隐式游标、动态游标
在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...
- Oracle入门(十四.10)之显式游标简介
一.上下文区域和游标 Oracle服务器分配一个称为上下文区域的私有内存区域来存储由SQL语句处理的数据. 每个上下文区域(因此每个SQL语句)都有一个与其关联的游标.您可以将游标视为上下文区域的标签 ...
- Oracle显式游标和隐式游标
游标的概念: 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处 ...
- Oracle入门(十四.11)之使用显式游标属性
一.游标和记录 此示例中的游标基于SELECT语句,该语句仅检索每个表行的两列. 如果它检索了六列或七,八,二十个呢? DECLAREv_emp_id employees.employee_id%TY ...
- 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 ...
最新文章
- Worker启动Executor源码
- Codeforces 797C Minimal string【贪心】
- jquery在当前页面打印页面div内容实例
- Echarts 地理信息可视化:基于地图显示坐标点信息
- linux进程管道通信缺点,Linux进程通信(IPC)的方式详解
- postgresql 增量备份
- 用SPFA判断是否存在负环
- [转]DataGridView显示行号的几种方法
- 【Python学习笔记】集合set
- 树莓派人脸打卡机(考勤机)(Python)
- W ndows7蓝屏0x00000024,Win7开机蓝屏报错0x00000024如何解决?
- Google Earth Engine(GEE)——估计未来人口密度(越南2100年人口预测)
- 从Darry Ring看奢侈品该如何玩转互联网思维
- 虚拟机soft lockup CPU死锁问题
- 什么是进程、进程的概念?
- 张宇考研数学闭关修炼【解析分册】
- 你不可不知的《哈利波特》秘密(四)
- 【小波滤波】基于小波变换的噪声信号滤波处理matlab仿真
- 2017年阿里Java面试基础题
- Python识别红绿灯代码
热门文章
- python3 issubset 判断列表子集
- php global变量无效
- php文件之间相互引用路径问题的一般处理方法
- API读取写入 ini文件内容的方法函数详解
- java中Error与Exception有什么区别
- AWS无服务开发Lambda系列之本地上传包至Lambda
- 新一代 Linux 文件系统 btrfs 简介
- 分屏显示_王者做图显示器,戴尔(DELL)U2417全面介绍
- qt中label画圆代表指示灯_【Qt编程】基于QWT的曲线绘制及图例显示操作——有样点的实现功能...
- mysql的雪崩穿透_缓存穿透、缓存击穿和缓存雪崩实践