1.游标简介

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

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

2.游标使用

  2.1 定义一个游标

CURSOR cursor_name IS select_statement;

例如:把数据表中emp中部门号为20的员工定义为游标:

CURSOR exce_emp is select * from scott.emp where deptno=20;

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

  2.2 为查询打开游标

打开游标实际上是从数据表中读取数据的过程,在这个过程中主要完成两件事:

①把select查询结果读入内存工作区中。

②将游标指针定位在第一条记录。

OPEN cursor_name

  2.3 取得结果放入PL/SQL变量中(利用fetch命令从游标中提取数据)

FETCH命令首先将当前游标指针所指的行读出来并且置于相应的变量中,然后把游标指针移到下一行。所以FETCH命令每一个执行的时候,只能提取一行或者部分的数据。

FETCH cursor_name INTO list_of_variables;  --变量(变量名1,变量名2......)
FETCH cursor_name INTO PL/SQL_record; --记录型变量名

  2.4 关闭游标

CLOSE cursor_name

举例:

declare
cursor exce_emp is select * from emp where empno=6676; --定义游标
var_exce_emp exce_emp%rowtype; --定义变量
begin
open exce_emp; --打开游标
fetch exce_emp into var_exce_emp; --fetch提取数据
dbms_output.put_line('提取的数据为:员工的姓名:'||var_exce_emp.ename||',员工的工作为:'||var_exce_emp.job);
close exce_emp;
end;

3.游标的属性

针对2.3,如果游标指针已经指到了游标的末尾,那么FETCH命令将读不到数据了,所以有这样一种机制,这种机制可以测出游标是否已经指到了游标的末尾。这种机制就是游标的属性。

游标有四个属性:%FOUND、%ISOPEN、%NOTFOUND、%ROWCOUNT

  3.1 %FOUND

该属性用于测试在自己所在语句之前的最后一个FETCH命令是否提取到了数据。如果能够提取到数据就返回true,否则返回false。但是如果一个游标还没有被打开就运用%FOUND,那么将会产生INVALID_CURSOR异常。

declare
cursor exce_emp is select empno,ename from emp where deptno=20;
var_exce_emp exce_emp%rowtype;
i int := 1;
begin
open exce_emp;
loop
fetch exce_emp into var_exce_emp;
if exce_emp %found then --利用%found属性检测是否提取到了数据
dbms_output.put_line('第'||to_char(i)||'个员工的信息-------编号:'||var_exce_emp.empno||'员工姓名:'||var_exce_emp.ename);
i := i+1;
else
exit;
end if;
end loop;
close exce_emp;
end;

  3.2 %ISOPEN

该属性主要用于测试游标是否已经打开。

declare
cursor exce_emp is select empno,ename from emp;
var_exce_emp exce_emp%rowtype;
begin
if not exce_emp%isopen then --检测游标是否已经打开
dbms_output.put_line('游标没有打开');
open exce_emp;
else
dbms_output.put_line('游标已经打开了');
end if;
end;

  3.3 %NOTFOUND 

fetch是否提到数据 没有true 提到false。

  3.4 %ROWCOUNT

已经取出的记录的条数

当刚刚打开游标时,%ROWCOUNT的值为0。每运行一次FETCH命令,%ROWCOUNT的值就会自增1。因此%ROWCOUNT的值可以看着是游标中当前被读取了的记录的条数,即游标循环中处理的当前行数。如果一个有游标在打开之前调用%ROWCOUNT属性,就会产生异常INVALID_CURSOR。

declare
cursor exce_emp is empno,ename from emp where deptno=20;
var_exce_emp exce_emp%rowtype;
n int := 5;
begin
open exce_emp;
loop
fetch exce_emp into var_exce_emp;
exit when exce_emp%notfound;
dbms_output.put_line('员工号:'||var_exce_emp.empno||',员工姓名:'||var_exce_emp.ename);
exit when exce_emp%rowcount=n;
end loop;
close exce_emp;
end;

4.隐式游标

【2.游标使用】介绍的都是显式游标。Oracle还默认了一种游标,这个游标就是隐式游标,隐式游标是不需要打开和关闭的。其被定义为SQL。它同时也具有4个属性。

declare
tempdeptno := 20;
counts int := 0;
begin
update emp set job='CLERK' where deptno = tempdeptno;
if sql%found then
counts := sql%rowcount;
end if;
dbms_output.put_line('对'||to_char(counts)||'行语句做了修改');
end;

显式游标和隐式游标的区别:

      

5.游标的常见操作

  5.1 FOR循环游标 (常用的一种游标)

--<1>定义游标
--<2>定义游标变量
--<3>使用for循环来使用这个游标 --前向游标 只能往一个方向走
--效率很高
declare
--类型定义
cursor cc is select empno,ename,job,sal
from emp where job = 'MANAGER';
--定义一个游标变量
ccrec cc%rowtype;
begin
--for循环
for ccrec in cc loop
dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
end loop;
end;

  5.2 FETCH游标

 --使用的时候 必须要明确的打开和关闭
declare
--类型定义
cursor cc is select empno,ename,job,sal
from emp where job = 'MANAGER';
--定义一个游标变量
ccrec cc%rowtype;
begin
--打开游标
open cc;
--loop循环
loop
--提取一行数据到ccrec中
fetch cc into ccrec;
--判断是否提取到值,没取到值就退出
--取到值cc%notfound 是false
--取不到值cc%notfound 是true
exit when cc%notfound;
dbms_output.put_line(ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal);
end loop;
--关闭游标
close cc;
end;

  5.3 参数游标

--按部门编号的顺序输出部门经理的名字
declare
--部门
cursor c1 is select deptno from dept;
--参数游标c2,定义参数的时候
--只能指定类型,不能指定长度
--参数只能出现在select语句=号的右侧
cursor c2(no number,pjob varchar2) is select emp.* from emp
where deptno = no and job=pjob;
c1rec c1%rowtype;
c2rec c2%rowtype;
--定义变量的时候要指定长度
v_job varchar2(20);
begin
--部门
for c1rec in c1 loop
--参数在游标中使用
for c2rec in c2(c1rec.deptno,'MANAGER') loop
dbms_output.put_line(c1rec.deptno||'-'||c2rec.ename);
end loop;
end loop;
end;

  5.4 引用游标 / 动态游标

-- select语句是动态的
declare
--定义一个类型(ref cursor)弱类型
type cur is ref cursor;
--强类型(返回的结果集有要求)
type cur1 is ref cursor return emp%rowtype;
--定义一个ref cursor类型的变量
cura cur;
c1rec emp%rowtype;
c2rec dept%rowtype;
begin
DBMS_output.put_line('输出员工') ;
open cura for select * from emp;
loop
fetch cura into c1rec;
exit when cura%notfound;
DBMS_output.put_line(c1rec.ename) ;
end loop ;
DBMS_output.put_line('输出部门') ;
open cura for select * from dept;
loop
fetch cura into c2rec;
exit when cura%notfound;
DBMS_output.put_line(c2rec.dname) ;
end loop;
close cura;
end;

(七)Oracle学习笔记—— 游标的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  3. 《Linux内核分析》第七周学习笔记

    <Linux内核分析>第七周学习笔记 可执行程序的装载 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

  4. 20165326 java第七周学习笔记

    第七周学习笔记 MySQL(数据管理系统)学习 知识点总结: 不能通过关闭MySQL数据库服务器所占用的命令行窗口来关闭MySQL数据库. 如果MySQL服务器和MySQL管理工具驻留在同一台计算机上 ...

  5. Oracle学习笔记——点滴汇总

    Oracle学习笔记——点滴汇总 http://www.botangdb.com/ Oracle GI = Grid Infrastructure = ASM + Cluster

  6. Oracle学习笔记之四sp1,Oracle 11g的常用函数

    从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i)    分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...

  7. Oracle学习笔记之四,SQL语言入门

    1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...

  8. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

  9. Oracle学习笔记—数据字典和常用命令(转载)

    转载自: oracle常用数据字典和SQL语句总结 Oracle常用命令大全(很有用,做笔记) 一.Oracle数据字典 数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一 ...

随机推荐

  1. 【DFS】STAMPS

    [Poj1010]STAMPS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18867   Accepted: 5469 ...

  2. BZOJ 3022 [Balkan2012]The Best Teams(扫描线+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3022 [题目大意] 给定n个球员,第i个球员年龄为AGEi,水平为SKILLi. 没有 ...

  3. 【bfs+优先队列】POJ2312-Battle City

    [思路] 题目中的“可以沿直线发射打破砖墙”可能会迷惑到很多人,实际上可以等价理解为“通过砖墙的时间为2个单位”,这样题目就迎刃而解了.第一次碰到时可能不能很好把握,第二次基本就可以当作水题了. [错 ...

  4. “Warning: Call-time pass-by-reference has been deprecated in”解决方法

    刚刚在调试一个PHP木马,显示错误信息为: Warning: Call-time pass-by-reference has been deprecated in E:\New-Hack520org\ ...

  5. c语言下的变量类型及计算

    源码 补码 反码 机器数:一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.   真值:第一位是符号位,将带符号位的 ...

  6. RACLE 错误 12899 处理, oracle 11g 更改字符集

    工作需要,安装装了oracle 11g,在导入其他机器上的备份数据的时间,发生一个错误: IMP-00019: 由于 ORACLE 错误 12899 而拒绝行IMP-00003: 遇到 ORACLE ...

  7. 两篇整合Activiti Modeler到业务系统

    1. 无法进入editor. http://localhost:8080/YouPRJ/modeler/service/editor?id=2050,前提是这个id必需存在与act_re_model表 ...

  8. RES协议

    MFC 通过HTML访问内部资源 资源导入JPG的图片,资源对应ID是137 <img src="res:/JPG/#137" width="100%" ...

  9. Asp.net Core CORS(跨域资源共享)实验

    环境:Asp.Net Core 2 1.问题 最近项目在调用远程UI时遇到点麻,在调用远程CSS文件时无法加载其中的字体文件.远程CSS文件对字体的定义: @font-face { font-fami ...

  10. android4.1 JELLY_BEAN:All WebView methods must be called on the same thread[问题已解决]

    11-06 18:29:15.582: W/WebView(27807): java.lang.Throwable: A WebView method was called on thread 'Ja ...