原文:Oracle基础 游标

一、游标  

  游标用来处理从数据库中检索的多行记录(使用SELECT语句)。利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集。

为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区。这个区包含了已经处理完的行数、指向被分析语句的指针,整个区是查询语句返回的数据行集。游标就是指向上下文区句柄或指针。

二、游标的分类:

  1、静态游标:静态游标是在编译时知道其SELECT语句的游标。静态游标又分为两种类型,隐式游标和显示游标。

  2、动态游标:用户为游标使用的查询直到运行的时候才能确定,可以使用REF游标和游标变量满足这个要求。为了使用引用游标,必须声明游标变量。有两种类型的REF游标:强类型REF游标和弱类型REF游标。

三、显示游标的用法:

  显示游标被用于处理返回多行数据的SELECT 语句,游标名通过CURSOR….IS 语句显示地赋给SELECT 语句。

(一)使用步骤;

1)声明游标:CURSOR cursor_name IS select_statement

2)为查询打开游标:OPEN cursor_name

3)取得结果放入PL/SQL变量中;

FETCH cursor_name INTO list_of_variables;

 FETCH cursor_name INTO PL/SQL_record;

4)关闭游标。CLOSE cursor_name

  注意:在声明游标时,select_statement不能包含INTO子句。当使用显示游标时,INTO子句是FETCH语句的一部分。

  例:显示雇员的名称和薪水

--使用LOOP遍历游标
DECLAREv_name emp.ename%TYPE;v_sal emp.sal%TYPE;CURSOR cus_emp ISSELECT ename,sal FROM emp;                         --声明游标
BEGINOPEN cus_emp;                                       --打开游标
   LOOP FETCH cus_emp INTO v_name,v_sal;                 --提取游标EXIT WHEN cus_emp%NOTFOUND;dbms_output.put_line('第'||cus_emp%ROWCOUNT||'个用户:  name:'||v_name||'     sal:'||v_sal);END LOOP;CLOSE cus_emp;                                      --关闭游标
END;

  显示游标的属性:

  %FOUND:只有在DML语句影响一行或者多行是,则返回TRUE;

  %NOTFOUND:没有影响任何行,则返回TRUE。

  %ROWCOUNT:返回DML语句影响的行数,没有影响则返回0;

  %ISOPEN:返回游标是否打开,在执行SQL之后,Oracle自动关闭SQL游标,所以隐式游标的%isopen属性始终未false;

  另一种方式:

--使用for来简化游标遍历
DECLARECURSOR cus_emp ISSELECT ename,sal FROM emp;
BEGINFOR record_emp IN cus_empLOOP dbms_output.put_line('第'||cus_emp%ROWCOUNT||'个用户:  name:'||record_emp.ename||'     sal:'||record_emp.sal);END LOOP;
END;

  record_emp是plsql声明的的记录变量,此变量的属性为声明为%ROWTYPE类型,作用域在FOR循环之内,即在FOR循环外就不能访问了。

  循环游标的特性:
  (1)从游标中提取了所有记录之后自动终止。
  (2)提取和处理游标中的每一条记录。
  (3)如果在提取记录之后%NOTFOUND属性返回TRUE,则终止循环。如果未返回任何行,则不进入循环。

游标案例:  

--给员工加薪,按员工入职时间进行加薪,每年加100,1000封顶
DECLAREv_date emp.hiredate%TYPE;v_empno emp.empno%TYPE;v_money NUMBER;CURSOR cur_emp ISSELECT empno,hiredate FROM emp;
BEGINOPEN  cur_emp;LOOPFETCH cur_emp INTO v_empno,v_date;EXIT WHEN cur_emp%NOTFOUND;v_money := 100*(1990-to_char(v_date,'yyyy'));IF v_money<1000 THENUPDATE emp SET sal=sal+v_money WHERE empno=v_empno;ELSEUPDATE emp SET sal=sal+1000 WHERE empno=v_empno;END IF;   END LOOP;
END;

四、隐式游标:

  所有的隐式游标都被假设为只返回一条记录。
  使用隐式游标时,用户无需进行声明、打开及关闭。PL/SQL隐含地打开、处理,然后关掉游标。多条sql语句 隐式游标SQL永远指的是最后一条sql语句的结果,主要使用在update 和 delete语句上。

  隐式游标的四个属性:

属性 说明
 SQL%rowcount  影响的记录的行数整数(用来判断插入,更新修改是否成功,必须在comit之前,否则提交后结果为0.)
 SQL%found  影响到了记录 true()
 SQL%notfound  没有影响到记录 true
 SQL%isopen  是否打开 布尔值 永远是false

例如:

DECLARErow_emp emp%ROWTYPE;
BEGINSELECT ename,sal INTO row_emp.ename,row_emp.salFROM emp WHERE emp.empno = 7369;--判断是否查到数据if(SQL%ROWCOUNT=1) THENdbms_output.put_line('找到了');END IF;--另一种方式判断IF(SQL%Found) THENdbms_output.put_line('找到了');END IF;dbms_output.put_line('ename:'||row_emp.ename||'    sal:'||row_emp.sal);
END;

上述游标自动打开,并把相关值赋给对应变量,然后关闭。执行完后,PL/SQL变量rowemp.ename,rowemp.sal中已经有了值。

五:动态游标

  静态游标是在声明就已经确定查询语句,如果用户需要在运行时动态决定游标执行的查询,就需要使用动态游标(REF游标)。

  动态游标分为两类:强类型游标和弱类型游标。

  动态游标使用步骤:

  1、声明动态游标类型;

  2、打开游标,指定游标查询;

  3、提取游标。

  4、关闭游标。

  例:

  强类型游标,使用return声明的游标为强类型游标。在对游标进行绑定查询只能绑定游标返回的类型rowtype。

--强类型的动态游标,查询emp表中的数据
DECLARETYPE ref_cur IS REF CURSOR    --声明游标类型RETURN emp%ROWTYPE;       --带返回值的为强类型动态游标refcur_emp ref_cur;         --游标类型对象v_emp emp%ROWTYPE;
BEGINOPEN refcur_emp FOR        --将游标绑定到一个查询语句,因为声明的是强类型,所以只能绑定emp;SELECT * FROM emp;    LOOPFETCH refcur_emp INTO v_emp;     --提取游标内容EXIT WHEN refcur_emp%NOTFOUND;dbms_output.put_line(refcur_emp%Rowcount||'、name:'||v_emp.ename||'    sal:'||v_emp.sal);END LOOP;CLOSE refcur_emp;
END;

  

  弱类型游标:可以用来绑定多个查询结果。

  例:

--弱类型游标
DECLARETYPE refcur IS REF CURSOR;   --未定义返回类型为弱类型游标
  rc refcur;v_name emp.ename%TYPE;v_deptname dept.dname%TYPE;
BEGINOPEN rc FOR SELECT ename,dname FROM emp e,dept d WHERE e.deptno = d.deptno;  --绑定查询
  LOOPFETCH rc INTO v_name,v_deptname;    EXIT WHEN rc%NOTFOUND;dbms_output.put_line('name:'||v_name||'               deptname:'||v_deptname);END LOOP;CLOSE rc;
END;

  例:

--根据输入的内容绑定游标
DECLARE TYPE refcur IS REF CURSOR;rc refcur;v_tablename VARCHAR2(10) := '&tab';v_id NUMBER;v_name VARCHAR2(20);
BEGINIF(v_tablename = 'e') THENOPEN rc FOR SELECT e.empno,e.ename INTO v_id,v_name FROM emp e;dbms_output.put_line('=========员工信息=============');Elsif(v_tablename = 'd') THENOPEN rc FOR SELECT d.deptno,d.dname INTO v_id,v_name FROM dept d;dbms_output.put_line('=========部门信息=============');ELSEdbms_output.put_line('输入错误,请输入e或者d!');RETURN;END IF;  LOOP FETCH rc INTO v_id,v_name;dbms_output.put_line('#'||rc%Rowcount||'   id:'||v_id||'   name:'||v_name);EXIT WHEN rc%NOTFOUND;END LOOP;
END;

Oracle基础 游标相关推荐

  1. 使用oracle 游标修改数据,修改oracle数据库游标

    SQL游标原理和使用方法 版权声明:本文为博主原创文章,未经博主允许不得转载.https://blog.csdn.net/chinahuyong/article/details/3552248 SQL ...

  2. oracle父游标和子游标,诊断Oracle high version count(高版本游标)问题

    什么是high version cursor(高版本游标)?对于一个特定的游标有多少个版本就属于高版本游标是没有明确定义的.对于不同的系统有不同 什么是high version cursor(高版本游 ...

  3. 大型数据库Oracle基础练习

    大型数据库Oracle基础 一.创建数据库和表 二.创建数据库和表 三.表的CRUD操作 四.数据库的查询 五.数据库安全性 六.存储过程的使用 七.数据库综合设计 一.创建数据库和表 1.详细描述O ...

  4. oracle基础之sql基础知识

    1. sql(Structured Query Language)是关系型数据库的基本操作语言. 包括数据库查询(Data Query),数据操纵(Data Manipulation),数据定义(Da ...

  5. Oracle基础知识总结

    ORACLE 基础 ORACLE 数据库具有以下特点: 支持多用户.大事务量的事务处理 数据安全性和完整性控制 支持分布式数据处理 可移植性 ORACLE 体系结构 数据库 实例 数据文件(dbf) ...

  6. Oracle 基础教程

    oracle基础教程 目录 1.oracle的安装 2.变量和类型 3.控制语句 4.oracle用户及授权管理 5.管理数据表 6.查询数据表 7.操纵数据表 8.SQL内置函数 9.触发器 10. ...

  7. oracle fra空间不足,ORACLE 基础解决方案1_扩大FRA区

    ORACLE 基础解决方案(一) Reviewing the Database Architecture Reviewing the Database Architecture 回顾数据库结构 For ...

  8. oracle 基础1

    目    录 一. 数据库基础部分 第一章       oracle基础介绍 第二章  数据查询语言(QL) 第三章  数据定义语言(DDL) 第四章  Oracle数据分区表 第五章  PL/SQL ...

  9. Oracle 基础知识——客户端连接oracle数据库服务端的四种方法

    Oracle基础知识 Oracle Database 11g 快捷版 (Oracle Database XE) 是一款基于 Oracle Database 11g 第 2 版代码库的小型入门级数据库, ...

最新文章

  1. java joptionpane 例子_java JOptionPane类的介绍
  2. linux怎么创建扩展分区,Linux磁盘创建扩展分区
  3. fputc会覆盖吗_墨粉寿命和打印的文件有关系吗?
  4. Linux串口应用编程
  5. ASP.NET Core和json请求这样用真简单,axios、微信小程序得救了
  6. 战神4 幕后花絮 概念艺术_Java 9幕后花絮:新功能从何而来?
  7. 【转】WPF调用图片路径,或资源图片
  8. pcb只开窗不镀锡_案例图解射频PCB设计要点
  9. Linux高级编程--06.进程概述
  10. 网易编程题------操作序列
  11. MySQL中int(11)最大长度是多少?
  12. 阻止picker.js插件弹出键盘
  13. Qt Http实现网络文件下载
  14. Nodejs安装教程
  15. 技巧:删除桌面上提示找不到该项目的文件
  16. Java实现腾讯云发送短信
  17. [网站建设] 深度解析搜索引擎的原理结构
  18. unity3d实现飞行模拟
  19. 如何有效开展小组教学_如何有效开展小组合作学习活动
  20. Spring(入门)

热门文章

  1. 如何写dblink?
  2. decode()、nvl()等用法详解
  3. string赋值-单引号和双引号的区别(php)
  4. oracle 取mac地址,java执行命令,得到Mac地址
  5. activiti 工作流_分享:springboot中关于工作流activiti的搭建
  6. java后端传object给js_【JSON】JSON在前端和后端传递
  7. 质数之和c语言编程,C程序检查一个数字是否可以表示为两个质数之和
  8. php中datetime,珍藏 PHP中DateTime的常用方法
  9. MySQL表结构管理
  10. python导入xlsxwriter要安装什么吗_windows下安装Python的XlsxWriter模块方法