PL\SQL 语句用游标来管理SQL语句返回的记录. 游标是为处理这些语句而分配的一个私有SQL工作区,用来执行和存储SQL语句处理的信息.Oracle服务器用游标来命名每一个SQL工作区,不同的SQL语句,游标的使用情况不同,可将游标分为两类:隐式游标和显示游标.
隐式游标对应于DML语句和select语句的执行空间和相应的信息.系统自动将此类游标命名为SQL.例如,执行一条SELECT语句时,Oracle 自动为该语句创建一个游标,当"打开"游标时,实际上是执行该SELECT语句将数据读取到SQL工作区中;当移动游标指针时,实际上是将游标指针指向该SELECT语句返回的下一条记录.
显示游标一般用于需要对多条记录按顺序一条一条进行处理的场合,能方便地控制数据的处理过程,被处理的数据集成为活动数据集.显示游标由程序员定义和维护,名称由程序员确定.
declare
cursor c is
select * from emp;
v_emp c%rowtype;
begin
open c;
fetch c into v_emp;
dbms_output.put_line(v_emp.ename);
close c;
end;
/
游标加入循环
declare
cursor c is
select * from emp;
v_emp c%rowtype;
begin
open c;
loop
fetch c into v_emp;
exit when (c%notfound);
dbms_output.put_line(v_emp.ename);
end loop;
close c;
end;
/
游标的属性:
1)%ISOPEN: 布尔型.判断指定的游标是否已经打开
2)%NOTFOUND 布尔型.如最近一次fetch操作没有返回结果,则值为TRUE .
3)%FOUND 布尔型 .最近一次fetch操作有返回结果,则值为TRUE .
4)%ROWCOUNT 数值型 ,取值为当前位置返回的记录数,可用该属性控制要处理的记录数.
for 循环:
declare
cursor c is
select * from emp;
begin
for v_emp in c loop
dbms_output.put_line(v_emp.ename);
end loop;
end;
/
带参数的游标:
declare
cursor c (v_deptno emp.deptno%type,v_job emp.job%type)
is
select ename,sal from emp where deptno = v_deptno and job = v_job;
--v_temp c%rowtype;
begin
for v_temp in c(30,'CLERK') loop
dbms_output.put_line(v_temp.ename);
end loop;
end;
/
使用游标进行更新 : 非重点
declare
cursor c
is
select * from emp2 for update;
--v_temp c%rowtype ;
begin
for v_temp in c loop
if(v_temp.sal<2000) then
update emp2 set sal =sal *2 where current of c;
elsif (v_temp.sal = 5000) then
delete from emp2 where current of c;
end if ;
end loop;
commit;
end;
/