个人总结:
游标就是一个指向在客户端通过查询语句返回结果集中的指针,它存储在服务器端、
并维护着它内部所存储的数据,它主要利用了服务器端的高性能,解决了复杂运算在网
络间通信差的问题,游标不可乱用,否则会对服务器端的性能造成一定的影响。
一、显式游标
1.由用户显式声明 cursor
2.游标将指向活动集中的当前行
二、控制显式游标分为三个步骤
1.Open
2.Fetch 提取
3.Close
-- 注意 游标需要先声明,然后才能使用哦.
示例1:使用游标简单的提取一行记录
declare
/*以下声明了一个显式游标,指向查询到得结果集*/
cursor empCur is select * from emp;
emprow emp%rowtype; --用于存储emp表的一行记录
begin
open empCur; --打开游标
fetch empCur into emprow; --从游标中提取一行记录
DBMS_output.put_line('employee no:'||emprow.empno||'employee name'||emprow.ename);
close empCur; --关闭游标
end;
示例2:使用游标提取表中的所有记录,用loop循环提取
declare
cursor empCur is select * from emp;--声明游标
emprow emp%rowtype; --用于存储emp表的一行记录
begin
open empCur;
loop
fetch empCur into emprow;
exit when empCur%notfound; --退出条件
DBMS_output.put_line('employee no:'||emprow.empno||'employee name:'||emprow.ename);
DBMS_output.put_line('提取了'||empCur%rowcount);
end loop;
close empCur; --关闭游标
end;
示例3:使用游标提取表中的所有记录,用while循环提取
declare
cursor empCur is select * from emp;--声明游标
emprow emp%rowtype; --存储emp表的一行记录
begin
open empCur;
fetch empCur into emprow; --先初始化
While empCur%Found Loop --进入循环的条件
DBMS_output.put_line('employee no:'||emprow.empno||' '||'employee name:'||emprow.ename);
DBMS_output.put_line('提取了'||empCur%rowcount);
fetch empCur into emprow; --增量条件 否则进入死循环
end loop;
close empCur; --关闭游标
end;
示例4:使用游标提取表中的所有记录,用for循环提取
特点是:
自动声明行级变量
自动打开
自动提取
自动关闭的
简化代码的编写
缺点是:
一次性会把结果集都输出。造成不必要的资源浪费。
declare
cursor empCur is select * from emp;--声明游标
begin
for emprow in empCur loop
DBMS_output.put_line('employee no:'||emprow.empno||' '||'employee name:'||emprow.ename);
DBMS_output.put_line('提取了'||empCur%rowcount);
end loop;
end;
示例5:改造游标,使用绑定变量,使游标具有动态性
使用绑定变量在编译时对代码进行赋值
declare
cursor empCur is select * from emp where sal>&InputSalary;
iCount int;
begin
iCount:=&iCount;
DBMS_output.put_line('iCount='||iCount);
for emprow in empCur loop
DBMS_output.put_line('employee no:'||emprow.empno||' '||'employee name:'||emprow.ename);
DBMS_output.put_line('提取了'||empCur%rowcount);
end loop;
end;
示例6:带参数的游标使用方法
declare
cursor empCur(param number default 10) is select * from emp where deptno=param;
begin
for emprow in empCur(10) loop
DBMS_output.put_line('employee no:'||emprow.empno||' '||'employee name:'||emprow.ename);
end loop;
end;