本节对Oracle中的游标进行详细讲解。

本节所举实例来源Oracle中scott用户下的emp表dept表:

一、游标:

1、概念:

游标的本质是一个结果集resultset,主要用来临时存储从数据库中提取出来的数据块。

二、游标的分类:

1、显式游标:由用户定义,需要的操作:定义游标、打开游标、提取数据、关闭游标,主要用于对查询语句的处理。

属性:%FOUND        %NOTFOUND        %ISOPEN          %ROWCOUNT

Example:打印emp表的员工信息

DECLARE
CURSOR emp_cursor IS SELECT empno,ename,job FROM emp;
v_empno emp.empno%TYPE;
v_name emp.ename%TYPE;
v_job emp.job%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_empno,v_name,v_job;
DBMS_OUTPUT.PUT_LINE('员工号为:'||v_empno||'姓名是'||v_name||'职位:'||v_job);
EXIT WHEN emp_cursor%NOTFOUND;
END LOOP;
CLOSE emp_cursor;
END;

这里严格按照显示游标的书写规则:DECLARE emp_cursor定义游标OPEN emp_cursor打开游标FETCH emp_cursor INTO...提取数据CLOSE emp_cursor关闭游标,因为提取出来的数据属于多行,所以通过loop循环打印即可。

Example2:检验游标是否打开,如果打开显示提取行数

DECLARE
CURSOR emp_cursor IS SELECT empno,ename,job FROM emp;
v_empno emp.empno%TYPE;
v_name emp.ename%TYPE;
v_job emp.job%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_empno,v_name,v_job;
EXIT WHEN emp_cursor%NOTFOUND;
END LOOP;
IF emp_cursor%ISOPEN THEN
DBMS_OUTPUT.PUT_LINE('游标已打开');
DBMS_OUTPUT.PUT_LINE('读取了'||emp_cursor%ROWCOUNT||'行');
ELSE
DBMS_OUTPUT.PUT_LINE('游标没有打开');
END IF;
CLOSE emp_cursor;
END;

通过%ISOPEN属性判断游标是否打开,%ROWCOUNT判断获取行数。

2、隐式游标:由系统定义并为它创建工作区域,并且隐式的定义打开提取关闭,隐式游标的游标名就是'SQL',属性和显示游标相同,主要用于对单行select语句或dml操作进行处理。

Example:又用户输入员工号修改员工工资如成功则打印输出成功标志。

为了尽量不改变原表,创建新表emp_new和原表数据相同:

CREATE TABLE emp_new
AS
SELECT * FROM emp;
BEGIN
UPDATE emp_new SET sal = sal+500 WHERE empno=&empno;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('成功修改');
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('修改失败');
ROLLBACK;
END IF;
END;

这里注意增删改以后要对做的操作进行commit提交,如果操作失败则rollback回滚刚才的操作。

3、参数游标:

在定义游标时加入参数的游标,可以配合游标for循环快速找到需要的数据。这里先讲一下游标for循环

A、游标FOR循环:

隐含的执行了打开提取关闭数据,代码精简很多。Expression:

FOR table_record IN table_cursor LOOP

  STATEMENT;

END LOOP;

Example:使用游标For循环打印输出员工信息:

DECLARE
CURSOR emp_cursor IS SELECT empno,ename,job FROM emp;
BEGIN
FOR emp_record IN emp_cursor LOOP
DBMS_OUTPUT.PUT_LINE('员工号:'||emp_record.empno||'员工姓名'||emp_record.ename||'员工职位'||emp_record.job);
END LOOP;
END;

这里游标FOR循环省去了对于取到的数据的变量的命名和赋值,同时如果全部打印则不用写循环条件,代码精简了很多。

如果想让代码更加精简,则可以去掉对游标的声明引入子查询即可,操作如下。

BEGIN
FOR emp_record IN (SELECT empno,ename,job FROM emp) LOOP
DBMS_OUTPUT.PUT_LINE('员工号:'||emp_record.empno||'员工姓名'||emp_record.ename||'员工职位'||emp_record.job);
END LOOP;
END;

代码更加精简,得到的结果相同。和隐式游标是不是有点像,但隐式游标主要用于的是单行select和dml语句的操作,注意2者用法的区别。

下面继续参数游标的实例:

Example:输入部门号打印员工信息:

DECLARE
CURSOR emp_cursor(dno NUMBER)IS SELECT empno,ename,job FROM emp WHERE deptno=dno;
BEGIN
FOR emp_record IN emp_cursor(&dno) LOOP
DBMS_OUTPUT.PUT_LINE('员工号'||emp_record.empno||'姓名'||emp_record.ename||'职位'||emp_record.job);
END LOOP;
END;

这里既然有参数,那么必然会有对游标的声明,在结合游标FOR循环快速超找所需要的数据。

三、使用游标修改数据的注意事项

1、使用游标修改数据时,为防止他人在自己操作数据时对数据进行修改,oracle提供for update子句进行加锁。

同时在你使用update或delete时,必须使用where current of+name_cursor语句,以及在最后记得提交。如果

是级联操作则可以使用for update of 来进行相关表的加锁。

Example1:对职位是PRESIDENT的员工加1000工资,MANAGER的人加500工资

CREATE TABLE emp_new
AS
SELECT * FROM emp;
DECLARE
CURSOR empnew_cursor IS SELECT ename,job FROM emp_new FOR UPDATE;
BEGIN
FOR empnew_record IN empnew_cursor LOOP
DBMS_OUTPUT.PUT_LINE('姓名'||empnew_record.ename||'职位'||empnew_record.job);
IF empnew_record.job='PRESIDENT' THEN
UPDATE emp_new SET sal=sal+1000 WHERE CURRENT OF empnew_cursor;
ELSIF empnew_record.job='MANAGER' THEN
UPDATE emp_new SET sal=sal+500 WHERE CURRENT OF empnew_cursor;
END IF;
END LOOP;
COMMIT;
END;
SELECT * FROM EMP WHERE job in('PRESIDENT','MANAGER');
SELECT * FROM EMP_NEW WHERE job in('PRESIDENT','MANAGER');

可以看到这里工资有了相应的变化。

至此,Oracle游标解析完毕,总而言之,游标只是作为我们从数据库中提取出来的一部分数据,我们针对这个结果集做一系列的操作。

                                            2018-09-07    16:15:34

Oracle游标解析的更多相关文章

  1. Oracle硬解析,软解析,软软解析介绍

    Oracle数据库中的CURSOR分为两种类型:Shared Cursor 和 Session Cursor 1,Shared Cursor Oracle里的第一种类型的Cursor就是Shared ...

  2. Oracle 游标示例,带异常处理

    Oracle游标示例一则,带异常处理. DECLARE CURSOR c_dl IS SELECT ID, NSRSBH, WSPZXH, ZXYY_DM, HZRQ, SWJG_DM, GXSJ F ...

  3. Oracle游标带参数

    Oracle游标是可以带参数的,而SqlServer的游标就不可以了 create or replace procedure a as cursor b(c_id int)is select * fr ...

  4. Oracle 游标使用(转)

    这个文档几乎包含了oracle游标使用的方方面面,全部通过了测试 ; ; dbms_output.put_line(sql) loop dbms_output.put_line( ; ; ; r_te ...

  5. Oracle 游标使用全解(转)

    转自:http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html 这个文档几乎包含了oracle游标使用的方方面面,全部通过了测试 -- ...

  6. Oracle游标动态赋值

    1. oracle游标动态赋值的小例子 -- 实现1:动态给游标赋值 -- 实现2:游标用表的rowtype声明,但数据却只配置表一行的某些字段时,遍历游标时需fetch into到精确字段 CREA ...

  7. dapper支持oracle游标

    dapper支持oracle游标 Dapper是一个轻型的ORM类.它有啥优点.缺点相信很多朋友都知道了,园里也有很多朋友都有相关介绍,这里就不多废话. 如果玩过Oracle都知道,存储过程基本都是通 ...

  8. Oracle游标的使用示例

    此文是使用Oracle游标的几种方式,for...in会自动打开游标,fetch...into需要手动打开游标,游标类似于一个只会往前移动的指针,每次指向数据集中的一行数据,通过游标可以打开数据集,也 ...

  9. Oracle游标介绍

    Oracle游标使用详解: 游标: 用来查询数据库,获取记录集合(结果集)的指针,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标.要在程序中使用游标,必须 ...

随机推荐

  1. 第七章 常用Java集合类总结

    7.1.List(允许重复元素) ArrayList: 底层数据结构:Object[] 在查询(get).遍历(iterator).修改(set)使用的比较多的情况下,用ArrayList 可扩容,容 ...

  2. MSSQL工作中常用的小技巧

    大概看了一下有接近二十天自己没有写博客了,一来是因为国庆之前公司工作总会比较繁杂一点,国庆自己也需要休息,二来是因为学习一些新的东西,公司写了一天SQL回家看了看以前的笔记,感觉还挺不错,贴出来供大家 ...

  3. IOS中键盘隐藏几种方式

    在ios开发中,经常需要输入信息.输入信息有两种方式: UITextField和UITextView.信息输入完成后,需要隐藏键盘,下面为大家介绍几种隐藏键盘的方式. <一> 点击键盘上的 ...

  4. 向量的表示及协方差矩阵 (PCA的理论基础)

    原文:http://blog.csdn.net/songzitea/article/details/18219237 引言 当面对的数据被抽象为一组向量,那么有必要研究一些向量的数学性质.而这些数学性 ...

  5. RPC框架研究(二)Hadoop源代码-1

    报名了阿里中间件性能大赛,我来说是一个全新的挑战.一切从空白学起,比赛的过程也是学习的过程 是的.想让自己学好.给自己报一个比赛吧~ 就像当初学围棋,也是报了围棋比赛,为了不至于输的太慘.一个星期里学 ...

  6. javascript深度克隆对象

    /** * * @param obj * @returns {*} */ //深度克隆 function cloneObject(obj) { if (obj === null || typeof(o ...

  7. netdata的安装与使用

    具体的netdata介绍请参照GIT:https://github.com/firehol/netdata/wiki 以下只介绍centos下的netdata的安装与使用: 1.安装Netdata需要 ...

  8. 【Android 百度地图实战】2.几种地图图层的显示

    具体代码官网API已提供,地址在这. 效果图如下: 主要代码: // 创建选项菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { ...

  9. IE hack 汇总

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 解决Linux SSH登录慢

    出现ssh登录慢一般有两个原因:DNS反向解析的问题和ssh的gssapi认证 :ssh的gssapi认证问题 GSSAPI ( Generic Security Services Applicati ...