为了处理SQL语句Oracle将在内存中分配一个区域这就是上下文区这个区包含了已经处理完的行数指向被分析语句的指针整个区是查询语句返回的数据行集游标就是指向上下文区句柄或指针
两种游标
一显示游标(需要明确定义!)
显示游标被用于处理返回多行数据的SELECT 语句游标名通过CURSOR…IS 语句显示地赋给SELECT 语句
在PL/SQL中处理显示游标所必需的四个步骤
)声明游标CURSOR cursor_name IS select_statement
)为查询打开游标OPEN cursor_name
)取得结果放入PL/SQL变量中
FETCH cursor_name INTO list_of_variables;
FETCH cursor_name INTO PL/SQL_record;
)关闭游标CLOSE cursor_name
注意在声明游标时select_statement不能包含INTO子句当使用显示游标时INTO子句是FETCH语句的一部分
显式游标
select语句上 使用显式游标
能明确访问结果集
for循环游标
参数游标
解决多行记录的查询问题
fetch游标
二隐式游标
所有的隐式游标都被假设为只返回一条记录
使用隐式游标时用户无需进行声明打开及关闭PL/SQL隐含地打开处理然后关掉游标
例如
……
SELECT studentNostudentName
INTO curStudentNocurStudentName
FROM StudentRecord
WHERE name=gg;
上述游标自动打开并把相关值赋给对应变量然后关闭执行完后PL/SQL变量curStudentNocurStudentName中已经有了值
隐式游标
单条sql语句所产生的结果集合
用关键字SQL表示隐式游标
个属性 %rowcount 影响的记录的行数 整数
%found 影响到了记录 true
%notfound 没有影响到记录 true
%isopen 是否打开 布尔值 永远是false
多条sql语句 隐式游标SQL永远指的是最后一条sql语句的结果
主要使用在update 和 delete语句上
实际操作和例子
()FOR循环游标 (常用的一种游标)
<>定义游标
<>定义游标变量
<>使用for循环来使用这个游标
前向游标 只能往一个方向走
效率很高
declare
类型定义
cursor cc is select empnoenamejobsal
from emp where job = MANAGER;
定义一个游标变量
ccrec cc%rowtype;
begin
for循环
for ccrec in cc loop
dbms_outputput_line(ccrecempno||||ccrecename||||ccrecjob||||ccrecsal);
end loop;
end;
() fetch游标
使用的时候 必须要明确的打开和关闭
declare
类型定义
cursor cc is select empnoenamejobsal
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_outputput_line(ccrecempno||||ccrecename||||ccrecjob||||ccrecsal);
end loop;
关闭游标
close cc;
end;
游标的属性种
%notfound fetch是否提到数据 没有true 提到false
%found fetch是否提到数据 有true 没提到false
%rowcount 已经取出的记录的条数
%isopen 布尔值 游标是否打开
()参数游标
按部门编号的顺序输出部门经理的名字
declare
部门
cursor c is select deptno from dept;
参数游标c定义参数的时候
只能指定类型不能指定长度
参数只能出现在select语句=号的右侧
cursor c(no numberpjob varchar) is select emp* from emp
where deptno = no and job=pjob;
crec c%rowtype;
crec c%rowtype;
定义变量的时候要指定长度
v_job varchar();
begin
部门
for crec in c loop
参数在游标中使用
for crec in c(crecdeptnoMANAGER) loop
dbms_outputput_line(crecdeptno||||crecename);
end loop;
end loop;
end;
()引用游标/动态游标
select语句是动态的
declare
定义一个类型(ref cursor)弱类型
type cur is ref cursor;
强类型(返回的结果集有要求)
type cur is ref cursor return emp%rowtype;
定义一个ref cursor类型的变量
cura cur;
crec emp%rowtype;
crec dept%rowtype;
begin
DBMS_outputput_line(输出员工) ;
open cura for select * from emp;
loop
fetch cura into crec;
exit when cura%notfound;
DBMS_outputput_line(crecename) ;
end loop ;
DBMS_outputput_line(输出部门) ;
open cura for select * from dept;
loop
fetch cura into crec;
exit when cura%notfound;
DBMS_outputput_line(crecdname) ;
end loop;
close cura;
end;