游标的提出:
SQL是面向集合的,其结果一般是集合量(多条记录),而PL/SQL的变量一本是标量,其一组变量异常一直只能存放一条记录。所以仅仅使用变量并不能完全满足SQL语句向应用程序输出数据的要求。因为查询结果的记录数是不确定的,事先就不知道要声明几个变量,为此,在PL/SQL中引入了游标(cursor)的概念,用游标来协调这两种不同的处理方式。
游标的概念:
游标的使用可以让用户想操作数组一样操作查询出来的数据集,实际上,它提供了一种从集合性质的结果中提取单挑记录的手段。
游标(Cursor)形象地看出一个变动的光标。它实际上是一个指针,它在一段Oracle存放数据查询结果集的内存中,它可以指向结果集中的任意记录,初始是指向首记录。像数组的结构。
基本原理:
在PL/SQL快中执行selec,insert,update和,delete语句时,Oracle会在内存中为其分配上下文区(Context Area),即一个缓冲区。游标是指向该去的一个指针,或是命名一个工作去,或是一种结构化数据类型。它为应用程序提供了一种具有多行数据查询结果集中的每一行数据分别进行单独处理的方法。
游标分为显示游标和隐式游标两种。
- 显示游标是由用户声明和操作的一种游标;是指在使用之前有明确的游标声明和定义,这样游标定义会关联数据查询语句,通常会返回一行或多行。打开游标后,用户可以利用游标的位置对结果集进行任何操作。
- 隐式游标是Oracle为所有数据操作语句(包括只返回单行数据的查询语句)自动声明和操作的一种游标。在每个用户会话中,可以同时打开多个游标,其数量由数据库初始参数文件的open cursors参数定义。它被PL/SQL自动关联,也叫SQL游标,由Oracle管理,用户无法控制但可以得到它的属性信息。
(提示:游标在PL/SQL中作为对数据库操作的必备部分应该熟练掌握,灵活地使用游标才能深刻地领会程序控制数据库操作的内涵。)
格式:
declare
cursor cemp xxx -- 1、定义游标
begin
open cemp -- 2、打开游标
loop --3、向下移动游标,借助循环
fetch cemp into xxxx; --4、抓取游标内容
exit when xxxx; --5、循环结束条件,当游标取不到值
end loop;
close cemp; --6、关闭游标
end
例子:取出emp中的工号empno、姓名ename和工资sal。
--定义游标
cursor cemp is select empno ,enmae,sal from emp;
vename emp.ename%type;
vempno emp.empno%type;
vsal emp.sal%type;
begin
--打开游标
open cemp;
--向下移动游标,借助循环
loop
fetch cemp into vempno,vename,vsal; --此处一定要和上面的属性顺序相同
--循环结束她条件,当游标取不到值
exit when cemp%notfound;
dbms_output.put_line(vempno||' '||vename||vsal);
end loop;
--关闭游标
close cemp;
end;
执行结果: